我与OpenXML文档工作,处理一些XSLT主文档的一部分。
我选择通过一组节点
<xsl:template match="w:sdt">
</xsl:template>
在大多数情况下,我只需要更换别的,匹配的节点,并且工作正常。
但在某些情况下,我需要不能代替在W:匹配SDT节点,但最近的w ^:对祖先节点(即包含SDT节点第一段节点)。
诀窍是该条件用于决定一个或另一个是基于从SDT节点的属性导出的数据,所以不能使用典型XSLT的xpath滤波器。
我试图做这样的事情
<xsl:template match="w:sdt">
<xsl:choose>
<xsl:when test={first condition}>
{apply whatever templating is necessary}
</xsl:when>
<xsl:when test={exception condition}>
<!-- select the parent of the ancestor w:p nodes and apply the appropriate templates -->
<xsl:apply-templates select="(ancestor::w:p)/.." mode="backout" />
</xsl:when>
</xsl:choose>
</xsl:template>
<!-- by using "mode", only this template will be applied to those matching nodes
from the apply-templates above -->
<xsl:template match="node()" mode="backout">
{CUSTOM FORMAT the node appropriately}
</xsl:template>
这整个概念的作品,但无论怎样我尝试过,它总是从自定义格式模板到W适用的格式:P节点,而不是它的父节点。
这几乎就像如果你不能从一个匹配节点引用父。 也许你可以没有,但我还没有发现,说你不能任何文档
有任何想法吗?
这个:
<xsl:apply-templates select="(ancestor::w:p)/.." mode="backout" />
会发现所有w:p
是上下文节点的祖先元素,并应用模板到每个父元素。 这听起来像你对我想要做的是找到只有最近的祖先,如可能的:
<xsl:apply-templates select="ancestor::w:p[1]/.." mode="backout" />
但是你描述这里应该是工作,以某种方式。 你或许应该验证您认为正在发生的事情其实是发生了什么,通过更换你backout
的东西更多的诊断,如模板:
<xsl:template match="node()" mode="backout">
<xsl:text>backout matched a </xsl:text>
<xsl:value-of select="name()"/>
<xsl:text> element.</xsl:text>
</xsl:template>
如果您已经处理了w:p
节点,当你遇到后裔你不能走回头路w:sdt
节点和替换为祖先做了处理。 您需要确定是否要处理时做自定义格式w:p
首先节点本身。
这样做的一个方法是重写你的模板w:p
节点,让你有
- 对于一般的模板
w:p
节点 - 为压倒一切的模板
w:p
节点是一个特例的最近的祖先w:sdt
节点
要确定是否一个w:p
是最近的祖先或没有,你可以使用xsl:key
。
例:
<xsl:key name="sdt-descendants"
match="w:sdt[@someAttribute='someValue']"
use="generate-id(ancestor::w:p[1])"/>
<xsl:template match="w:p">
<!-- General behavior -->
</xsl:template>
<xsl:template match="w:p[key('sdt-descendants', generate-id())]">
<!-- Specific behavior if the element is the closest w:p ancestor to a
descendant w:sdt element matching the provided criteria. -->
</xsl:template>
所述第二模板将被用于所有的w:p
是最接近祖先元素w:sdt
具有指定属性的元素,并且所述第一模板将被用于所有其它w:p
元素。
该办法后的孩子是不正确的的XSLT应用程序进程的父 。
请,提供一个工作(但最小的可能)例如,包含源XML文档和实际XSLT样式表。 此外,解释什么输出应该被制造,以及如何输出从源XML文档的。
这就是说,当前节点的父节点是由这个简单的XPath表达式选自 :
..
文章来源: Is it possible to navigate to the parent node of a matched node during XSLT processing?