我有以下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
问题是,它只匹配第一层,但不会深入到我希望它做的事情。 (对不起,如果这听起来有点奇怪,我不知道如何更好地描述它)
答案 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>