我的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
上面的代码工作正常,但不符合我的预期输出,如果我的子节点存在,我怎么才能循环我的子节点?
答案 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 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>