Получение родителя определенного узла вместе с его ребенком - PullRequest
0 голосов
/ 28 апреля 2011

У меня есть структура 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>

Я поместил это в переменную XML с именем 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>

Ответы [ 2 ]

2 голосов
/ 28 апреля 2011

Требуется что-то, что выбирает элемент 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 голос
/ 28 апреля 2011

XPath -

   /Page[*[@iscurrent='true']]

. * Выбирает потомков и себя.

...