我有一个类似以下的XML结构:
<Page Depth="1">
<Page Title="Communities" Depth="2">
<Page Title="Blog" iscurrent="true" Depth="3"/>
<Page Title="Something" Depth="3"/>
<Page Title="Anything" Depth="3"/>
</Page>
<Page Title="News" Depth="2">
<Page Title="Archived news" Depth="3"/>
</Page>
</Page>
我已将其放入名为sitemap
我正在努力使用XPATH,它将返回具有@iscurrent
属性的节点的父节点及其子节点。所以从上面的例子中,我需要以下子集:
<Page Title="Communities" Depth="2">
<Page Title="Blog" iscurrent="true" Depth="3"/>
<Page Title="Something" Depth="3"/>
<Page Title="Anything" Depth="3"/>
</Page>
我尝试过应用此模板,但没有输出:
<xsl:apply-templates mode="Tabs"
select="$sitemap/Page[@iscurrent='true']/parent/*" />
模板不应该相关,但无论如何,这是它的基本版本:
<xsl:template mode="Tab" match="*">
<li>
<xsl:if test="@iscurrent = 'true'">
<xsl:attribute name="class">current</xsl:attribute>
</xsl:when>
<xsl:value-of select="@MenuTitle" />
</li>
</xsl:template>
答案 0 :(得分:2)
您想要选择Page
元素,其子Page
iscurrent
属性等于true
:
$sitemap/Page[Page[@iscurrent='true']]
演示:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="sitemap" select="/Page" />
<xsl:template match="/">
<xsl:apply-templates select="$sitemap/Page[Page[@iscurrent='true']]" />
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
在此输入上:
<Page Depth="1">
<Page Title="Communities" Depth="2">
<Page Title="Blog" iscurrent="true" Depth="3" />
<Page Title="Something" Depth="3" />
<Page Title="Anything" Depth="3" />
</Page>
<Page Title="News" Depth="2">
<Page Title="Archived news" Depth="3" />
</Page>
</Page>
输出:
<Page Title="Communities" Depth="2">
<Page Title="Blog" iscurrent="true" Depth="3" />
<Page Title="Something" Depth="3" />
<Page Title="Anything" Depth="3" />
</Page>
答案 1 :(得分:1)
XPath是
/Page[*[@iscurrent='true']]
'*选择后代和自我。