繁体   English   中英

在XSLT中以与父节点不同的顺序到达子节点

[英]Reaching the child node in different order from parent nodes in XSLT

我一直在尝试解决XSLT中的一个问题,该问题到达特定父节点的子节点,而不管该父节点中的顺序如何。

假设我们有一个xml文件:

<book>
   <id>
      <type>
           <name name="something">
              --SomeText
           </name>
      </type>
    <id>
</book>
<book>
   <name name="something">

   <name>
   <id>
      --SomeNodes--
   </id>
   <number>
   </number>
</book>

这里的想法是,我有许多这样的节点集,并且每个节点集都有不同的<name>节点顺序。

我想要的是,无论顺序如何,每次与book节点匹配时,我都应该能够获取<name>节点的值。

XSLT:

<xsl:template match="book">

 <xsl:param name="rule" select="//name[1]>
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
   <xsl:if test=name/@name>
       <xsl:comment><xsl:value-of select="concat('some text', substring($rule,2,4))"/>
   </xsl:if>
</xsl:template>

因此,显然通过这种方法,由于“ //”,我得到了node的所有结果。

如果我将其更改为不带“ //”的名称[1],则它仅在书后找到名字元素,而在其他地方找不到。

每次与相同且完全相同的节点值匹配并在模板后将其值写为注释时如何递归获取。

注意:我给您的示例为XML,但我正在从XSLT-XSLT转换。

我认为,当您像这样对不整洁的数据进行任何类型的转换时,最好将其作为2遍处理进行:首先整理数据,然后将其转换为所需的形式。 这样,整理数据的过程便是可重用和独立的。

您只给出了输入格式的草图,但我将从转换书本元素开始,因此名称始终是顶级子级:

<xsl:template match="book">
  <xsl:copy>
    <name><xsl:value-of select=".//name"/></name>
    etc.
  </xsl:copy>
</xsl:template>

整理数据后,下一步将变得非常简单。

您可以尝试将其与<name>匹配,而不是将模板与<book>匹配。

<xsl:template match="name">
    <book>
        <xsl:copy>
            <xsl:apply-templates select="@name" />
        </xsl:copy>
    </book>
</xsl:template>

产量

<book>
    <name>something</name>
</book>
<book>
    <name>something</name>
</book>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM