假设我有这么简单的xml文件:
<store>
<author name="Jack">
<book>Book 1</book>
<book>Book 2</book>
</author>
<author name="Mike">
<book>Book 1</book>
</author>
</store>
你注意到杰克有两本书。我需要在XSLT翻译后输出以下内容:
<list>
<author>
<name>Jack</name>
<book>Book 1</book>
</author>
<author>
<name>Jack</name>
<book>Book 2</book>
</author>
<author>
<name>Mike</name>
<book>Book 1</book>
</author>
</list>
正如你在输出中注意到的(在xslt翻译之后),我们有2位作者杰克,每本书都有。我们可以在XSLT中做到这一点。在C / Java等中是否有类似的for-each?
如果杰克有7本书就有可能自动化这个,所以翻译之后会有7个杰克的描述符。谢谢。
答案 0 :(得分:2)
xsl:for-each
是一种方法。更灵活的方式是使用模板,如下面的XSLT。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/store">
<list>
<xsl:apply-templates select="author/book"/>
</list>
</xsl:template>
<xsl:template match="book">
<author>
<name>
<xsl:value-of select="../@name"/>
</name>
<xsl:copy-of select="."/>
</author>
</xsl:template>
</xsl:stylesheet>
使用xsl:for-each
方式只是将第二个模板的内容放在for-each中,如下所示:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/store">
<list>
<xsl:for-each select="author/book">
<author>
<name>
<xsl:value-of select="../@name"/>
</name>
<xsl:copy-of select="."/>
</author>
</xsl:for-each>
</list>
</xsl:template>
</xsl:stylesheet>