XSLT合并来自相关节点的信息

时间:2011-11-16 21:07:31

标签: xml xslt

我正在寻找XSLT(1.0)样式表。 我的输入类似于:

<?xml version="1.0" encoding="ISO-8859-1"?>

<city country="USA">
Washington
</city> 

<city country="USA">
New York
</city> 

<city country="Germany">
Berlin
</city> 

<country size="big">
USA
</country>


<country size="small">
Germany
</country>

我想要这样的输出:

Country USA 
Size: big
Cities: 
Washington
New York

Country Germany
Size: small
Cities:
Berlin

我正在尝试类似嵌套for-each循环的东西。但是当我在另一个节点内部时,我不知道如何访问节点。

如果这是一个重复的问题,我很抱歉:问题可能是我真的不知道如何表达我的问题以找到类似的问题。

1 个答案:

答案 0 :(得分:2)

不需要嵌套循环。以下样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <xsl:apply-templates select="/*/country"/>
    </xsl:template>
    <xsl:template match="country">
        <xsl:text>Country </xsl:text> 
        <xsl:value-of select="."/>
        <xsl:text>&#xa;Size: </xsl:text>
        <xsl:value-of select="@size"/>
        <xsl:text>&#xa;Cities:&#xa;</xsl:text>
        <xsl:apply-templates select="../city[@country=current()/text()]"/>
        <xsl:text>&#xa;</xsl:text>
    </xsl:template>
    <xsl:template match="city">
        <xsl:apply-templates/>
        <xsl:text>&#xa;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

应用于此输入:

<root>
    <city country="USA">Washington</city>
    <city country="USA">New York</city>
    <city country="Germany">Berlin</city>
    <country size="big">USA</country>
    <country size="small">Germany</country>
</root>

产地:

Country USA
Size: big
Cities:
Washington
New York

Country Germany
Size: small
Cities:
Berlin

注意:您提供的输入包含很多重要的空白,我在示例中删除了这些空白。