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

时间:2018-07-18 08:49:15

标签: xml 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 个答案:

答案 0 :(得分:1)

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

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

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

整理完数据后,下一步就很简单了。

答案 1 :(得分:0)

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

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