使用多个for-each循环从XML转换为XSLD

时间:2016-04-28 20:34:46

标签: xml xslt

我有以下XML值:

<Specialties>
    <Specialty>
      <Type>ZZ</Type>
      <Code>DF</Code>
      <Desc>DF</Desc>
    </Specialty>
    <Specialty>
      <Type>ZZ</Type>
    </Specialty>
    <Specialty>
      <Type>ZZ</Type>
      <Code>AF</Code>
      <Desc>AF</Desc>
    </Specialty>
</Specialties>

现在我需要为此创建XLST,以便我可以像这样转换输出:

<Specialties>
  <Specialty Type="ZZ" Code="DF" Desc="DF"/>
  <Specialty Type="ZZ"/>
  <Specialty Type="ZZ" Code="AF" Desc="AF"/>
</Specialties>

我尝试过写这样的XSLD:

<Specialties>
  <xsl:for-each select="/Specialties/*">
    <Specialty>
        <xsl:for-each select="/Specialties/Specialty/*">
            <xsl:attribute name="{name()}">
                <xsl:value-of select="text()"/>
            </xsl:attribute>
        </xsl:for-each>
    </Specialty>
  </xsl:for-each>
</Specialties>

但是它给出了输出:

<Specialties>
  <Specialty Type="ZZ" Code="AF" Desc="AF"/>
  <Specialty Type="ZZ" Code="AF" Desc="AF"/>
  <Specialty Type="ZZ" Code="AF" Desc="AF"/>
</Specialties>

所以我的问题是,如何通过编写XSLT获得所需的输出?

1 个答案:

答案 0 :(得分:1)

更改此行....

<xsl:for-each select="/Specialties/Specialty/*">

就是这个......

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

这将获取当前节点的所有子节点。当您使用/启动表达式时,这表示顶级文档节点,因此它将获取文档中所有Specialty个节点的所有子节点。