如何结合兄弟姐妹各自的孩子

时间:2015-11-10 18:22:41

标签: xml xslt

我有以下XML

<entry>
<cit>
    <level type="higher">
        <part>higher1</part>
        <part>higher2</part>
    </level>
    <level type="medium">
        <combination>medium1 medium2</combination>
        <part>medium1</part>
        <part>medium2</part>
    </level>
</cit>
<cit>
    <level type="higher">
        <part>higherA</part>
        <part>higherB</part>
        <part>higherC</part>
    </level>
    <level type="medium">
        <combination>mediumA mediumB</combination>
        <part>mediumA</part>
        <part>mediumB</part>
        <part>mediumC</part>
    </level>
</cit>
</entry>

我现在需要进行转换(XSLT 2.0) - 所需的输出类型只是文本 - 它以下列方式组合part元素的(level - )子元素:

higher1 : medium1
higher2 : medium2

higherA : mediumA
higherB : mediumB
higherC : mediumC

每个part兄弟中level元素的数量始终相等,但我事先并不知道是否有2,3,4或更多part个元素。

使用以下XSL文件

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="text" omit-xml-declaration="yes" indent="no" />
    <xsl:strip-space elements="*" />
    <xsl:template match="text()[not(string-length(normalize-space()))]" />
    <xsl:template match="text()[string-length(normalize-space()) > 0]">
        <xsl:value-of select="translate(.,'&#xA;&#xD;', '  ')" />
    </xsl:template>
    <xsl:template match="entry">
        <xsl:for-each select="cit">
            <xsl:for-each select="level[@type='higher']">
                <xsl:value-of select="part" />
                <xsl:for-each select="./../level[@type='medium']">: <xsl:value-of select="part" />
                </xsl:for-each>
            </xsl:for-each>
            <!--Trigger line break-->
            <xsl:text>&#xa;</xsl:text>
        </xsl:for-each>
    </xsl:template>
    <xsl:template match="text()[not(string-length(normalize-space()))]" />
    <xsl:template match="text()[string-length(normalize-space()) > 0]">
        <xsl:value-of select="translate(.,'&#xA;&#xD;', '  ')" />
    </xsl:template>
</xsl:stylesheet>

,我只能得到以下输出:

higher1 higher2: medium1 medium2
higherA higherB higherC: mediumA mediumB higherC

为了做到正确,我需要改变什么?谢谢你的提示!

1 个答案:

答案 0 :(得分:2)

怎么样:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="/entry">
    <xsl:for-each select="cit">
        <xsl:for-each select="level[@type='higher']/part">
            <xsl:variable name="i" select="position()" />
            <xsl:value-of select="." />
            <xsl:text> : </xsl:text>
            <xsl:value-of select="../../level[@type='medium']/part[$i]" />
            <xsl:text>&#10;</xsl:text>
        </xsl:for-each>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>