如何分别显示不同节点组中的子节点?

时间:2019-07-18 09:42:32

标签: xslt-1.0

我是xslt的新手。我正在将XML文件转换为平面文件。但是子节点值在每个节点组下一起显示。如何分别显示它们?

XML:

<list>
    <group name="group1">
        <item value="item1" />
        <item value="item11" />
    </group>
    <group name="group2">
        <item value="item2" />
        <item value="item22" />
        <item value="item222" />
    </group>
</list>

XSLT:

<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:ms="urn:schemas-microsoft-com:xslt">

    <xsl:template match="/">
    <xsl:for-each select="//list1/group">
      <xsl:text>group name</xsl:text>
      <xsl:value-of select="@name"/>
      <!--item -->
      <xsl:for-each select="//list1/group/item">
        <xsl:text>item value</xsl:text>
        <xsl:value-of select="@value" />
      </xsl:for-each>
    </xsl:for-each>
    <xsl:apply-templates/>
  </xsl:template> 
</xsl:stylesheet>

输出:

    group name  group1
    item value item1
    item value item11
    item value item2
    item value item22
    item value item22
    group name  group2
    item value item1
    item value item11
    item value item2
    item value item22
    item value item22

预期输出:

    group name  group1
    item value item1
    item value item11
    group name  group2
    item value item2
    item value item22
    item value item222

3 个答案:

答案 0 :(得分:1)

您发布的代码的主要问题在这里:

<xsl:for-each select="//list1/group/item">

这将始终选择整个XML文档中的所有item节点,从根节点开始,而忽略当前上下文。

更早的时候,您这样做:

<xsl:for-each select="//list1/group">

您被置于group的上下文中。从此处开始,要处理作为当前item的子元素的group元素,您应该简单地做:

<xsl:for-each select="item">

答案 1 :(得分:0)

最好使用xsl匹配功能,而不要使用“ for-each

可能的解决方案(选择所有item,然后输出父级的nameitem的{​​{1}}):

value

答案 2 :(得分:0)

Following code check:-

<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="group">
  <xsl:text>group name</xsl:text>
  <xsl:value-of select="@name"/>

<xsl:text>item value</xsl:text>
<xsl:value-of select="item/@value" />

</xsl:template>