xml子节点循环,每个语句使用2

时间:2014-03-18 08:58:35

标签: xml xslt

我的xml

<data>
<node name="a" link="www.a.com">
<node name="b" link="www.b.com">
   <subnode name ="b1" link="www.b1.com">
<node name="c" link="www.c.com">
</data>

我的xslt

<xsl:template match"/">
<xsl:for-each select="data/node">
    <a>
    <xsl:attribute name="href">
       <xsl:value-of select="@link">
    </xsl:attribute>
      <xsl:value-of select="@name">
    </a>

     <xsl:for-each select="data/node/subnode">
    <a>
    <xsl:attribute name="href">
       <xsl:value-of select="@link">
    </xsl:attribute>
      <xsl:value-of select="@name">
    </a>
</xsl:for-each>
</xsl:for-each>

</xsl:template>

输出

a
b
c

预期产出

a
b
    b1
c

上面的代码工作正常,但不符合我的预期输出,如果我的子节点存在,我怎么才能循环我的子节点?

2 个答案:

答案 0 :(得分:2)

您的模板正如所写的那样,期待以下形式的文档:

<data>
    <node name="a" link="www.a.com" />
    <node name="b" link="www.b.com" />
    <data>
        <node>
          <subnode name ="b1" link="www.b1.com" />
        </node>
    </data>
    <node name="c" link="www.c.com" />
</data>

由于XPath data/node/subnode。将其更改为:

</a>
<xsl:for-each select="subnode">
    <a>

它应该有用。

请注意,我假设您的示例已被编辑;它目前是无效的XML,但您提供的结果与格式良好的文档一致。

答案 1 :(得分:2)

我认为你可以大大缩短你的代码。 XSLT是一种函数式编程语言,for-each在许多地方都不合适。你显然不需要使用它。

其他一些事情:

  • 您的输入XML和XSLT代码都是格式错误的XML 。没有XSLT处理器或XML解析器可以接受它们。在这里发布问题时要更加小心。
  • 您显示的实际和预期输出不反映XSLT样式表中的说明。始终显示XML输出(当然,除了您希望输出为 text )。

<强>样式表

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="node|subnode">
   <a href="{@link}">
       <xsl:value-of select="@name"/>
   </a>
   </xsl:template>

</xsl:stylesheet>

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<a href="www.a.com">a</a>
<a href="www.b.com">b</a>
   <a href="www.b1.com">b1</a>
<a href="www.c.com">c</a>