XSL模板与所有内容都不匹配

时间:2016-08-02 14:37:45

标签: xml xslt

我有以下XML:

<function>
    <success>
        <response code="200" name="Ok">
            <content name="yellogUserId" type="long" />
            <contents name="functionalAreas" type="Json[]">
                <content name="functionalAreaId" type="long" />
                <content name="functionalAreaName" type="String" />
                <contents name="workPlaces" type="Json[]">
                    <content name="workPlaceId" type="long" />
                    <content name="workPlaceName" type="String" />
                </contents>
            </contents>
        </response>
    </success>
</function>

我有一个.xsl文件,它将xml转换为html文件。现在的问题是CONTENT和CONTENTS节点。这两个可以无限嵌套(CONTENT没有子节点,CONTENTS总是有内容作为子节点,但也可以包含更多内容)。我的XSL看起来像这样:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="no" omit-xml-declaration="yes" />

<xsl:template match="contents[content]">
    <li>
        <xsl:value-of select="@name" /> : <xsl:value-of select="@type" />
        <ul>
            <xsl:apply-templates select="content" />
        </ul>
    </li>
</xsl:template>

<xsl:template match="content">
    <li><xsl:value-of select="@name" /> : <xsl:value-of select="@type" /></li>
</xsl:template>

<xsl:template match="/">
    <div class="jumbotron">
        <table class="table table-bordered">
            <tr>
                <td class="tdleft">Success Response</td>
                <td class="tdright">
                    <xsl:for-each select="function/success/response">
                        <xsl:value-of select="@code" /> - <xsl:value-of select="@name" />
                        <xsl:if test="content">
                            <br/>
                            Content:
                            <ul>
                                <xsl:apply-templates select="content" />
                                <xsl:apply-templates select="contents" />
                            </ul>
                        </xsl:if>
                        <br/><br/>
                    </xsl:for-each>
                </td>
            </tr>
        </table>
    </div>
</xsl:template>

</xsl:stylesheet>

我改造后得到的是:

yellogUserId : long
functionalAreas : Json[]
    functionalAreaId : long
    functionalAreaName : String

但我想要的是:

yellogUserId : long
functionalAreas : Json[]
    functionalAreaId : long
    functionalAreaName : String
    workPlaces : Json[]
        workPlaceId : long
        workPlaceName : String

问题是,它只匹配第一层,但不会深入到我希望它做的事情。 (对不起,如果这听起来有点奇怪,我不知道如何更好地描述它)

1 个答案:

答案 0 :(得分:0)

在与contents匹配的模板中,您只需xsl:apply-templates选择content。您还应该选择contents

在:

<xsl:template match="contents[content]">
    <li>
        <xsl:value-of select="@name" /> : <xsl:value-of select="@type" />
        <ul>
            <xsl:apply-templates select="content" />
        </ul>
    </li>
</xsl:template>

后:

<xsl:template match="contents[content]">
    <li>
        <xsl:value-of select="@name" /> : <xsl:value-of select="@type" />
        <ul>
            <xsl:apply-templates select="content|contents" />
        </ul>
    </li>
</xsl:template>