XSLT:使用父子关系密钥

时间:2015-11-15 09:21:50

标签: xml xslt

假设每个第一个“部分” - > “typeAttr”是第二个孩子(A是父母,B是孩子),当然他们与其他“类型”相关。我如何使用xsl并将其翻译为html?

<root>
<Type>
    <Section typeAttr="B"/>
    <Section typeAttr="A"/>
</Type>
<Type>
    <Section typeAttr="C"/>
    <Section typeAttr="B"/>
</Type>
<Type>
    <Section typeAttr="D"/>
    <Section typeAttr="B"/>
</Type> 
<Type>
    <Section typeAttr="E"/>
    <Section typeAttr="C"/>
</Type>     
</root> 

这样的事情:

<ol>
<li>
    <a>A</a>
    <ol>
        <li>
            <a>B</a>
            <ol>
                <li><a>C</a>
                    <ol>
                        <li>
                            <a>E</a>
                        </li>
                    </ol>
                </li>
                <li>
                    <a>D</a>
                </li>
            </ol>
        </li>
    </ol>
</li>
</ol>

1 个答案:

答案 0 :(得分:0)

我相信这会返回预期的结果:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:key name="children" match="Type" use="Section[2]/@typeAttr" />
<xsl:key name="parent" match="Type" use="Section[1]/@typeAttr" />

<xsl:template match="/root">
    <ol>
        <xsl:apply-templates select="Type[not(key('parent', Section[2]/@typeAttr))]" mode="ancestor"/>
    </ol>
</xsl:template>

<xsl:template match="Type" mode="ancestor">
    <li>
        <a>
            <xsl:value-of select="Section[2]/@typeAttr"/>
        </a>
        <ol>
            <xsl:apply-templates select="."/>
        </ol>
    </li>
</xsl:template>

<xsl:template match="Type">
    <li>
        <a>
            <xsl:value-of select="Section[1]/@typeAttr"/>
        </a>
        <xsl:variable name="children" select="key('children', Section[1]/@typeAttr)" />
        <xsl:if test="$children">
            <ol>
                <xsl:apply-templates select="$children"/>
            </ol>
        </xsl:if>
    </li>
</xsl:template>

</xsl:stylesheet>