是否可以浏览到XSLT处理过程中匹配节点的父节点?(Is it possible to naviga

2019-10-20 20:17发布

我与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节点,而不是它的父节点。

这几乎就像如果你不能从一个匹配节点引用父。 也许你可以没有,但我还没有发现,说你不能任何文档

有任何想法吗?

Answer 1:

这个:

<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>


Answer 2:

如果您已经处理了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元素。



Answer 3:

如何parent::*或干脆..



Answer 4:

该办法后的孩子是不正确的的XSLT应用程序进程的父

请,提供一个工作(但最小的可能)例如,包含源XML文档和实际XSLT样式表。 此外,解释什么输出应该被制造,以及如何输出从源XML文档的。

这就是说,当前节点的父节点是由这个简单的XPath表达式选自

..


文章来源: Is it possible to navigate to the parent node of a matched node during XSLT processing?