获取特定节点的父节点及其子节点

时间:2011-04-28 03:03:34

标签: xml xslt xpath parent-child

我有一个类似以下的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

的XML变量中

我正在努力使用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>

2 个答案:

答案 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']]

'*选择后代和自我。