多个描述符在XSLT中转换为for-each

时间:2014-11-27 13:30:57

标签: xml xslt

假设我有这么简单的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个杰克的描述符。谢谢。

1 个答案:

答案 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>