选择祖先名称

时间:2016-08-22 11:45:38

标签: xslt xslt-2.0

我尝试使用XSLT打印祖先节点名称。

以下是我的XSLT。

<xsl:apply-templates select="(//title)[1]"/>

<xsl:template match="title">
<xsl:value-of select="name(ancestor::node())"/>
</xsl:template>

我的XML如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
    <!--ancestor-->
    <cd>
        <!--parent-->
        <title name="titleName" property="propertyName">Empire Burlesque</title>
        <!--self-->
        <artist>Bob Dylan</artist>
        <!--following-sibling-->
        <country>USA</country>
        <!--following-sibling-->
        <company>Columbia</company>
        <!--following-sibling-->
        <price>10.90</price>
        <!--following-sibling-->
        <year>1985</year>
        <!--following-sibling-->
    </cd>
</catalog>

这时我使用下面的陈述。

<xsl:value-of select="name(../..)"/>

否则当我使用

<xsl:value-of select="name(ancestor::node())"/>

<xsl:value-of select="name(ancestor::*)"/>

它给了我以下的例外

XSLT 2.0 Debugging Error: Error: file:///C:/Users/u0138039/Desktop/Training%20Docs/XSLT%20Training/Sample.xsl:209: Wrong occurrence to match required sequence type -   Details: -     XPTY0004: The parameter value ('3' item(s)) at position '1' of the 'name' function has the wrong occurrence to match the sequence type node() ('zero or one')

但要获取父名称,当我使用

<xsl:value-of select="name(parent::*)"/>

请让我知道为什么这适用于parent但不适用于ancestor

这非常令人困惑。如何使用ancestor等内容获取<xsl:value-of select="name(ancestor::node())"名称。

由于

1 个答案:

答案 0 :(得分:2)

ancestor轴包含上下文节点的所有祖先:其父级,祖父级,曾祖父母等,一直到根节点。

当您要求提供祖先的名称时,您必须在ancestor轴上选择一个的节点。例如:

<xsl:value-of select="name(ancestor::*[last()])"/>

将在您的示例中返回"catalog"(请注意,祖先是反向轴)。

OTOH,这:

<xsl:value-of select="ancestor::*/name()"/>

将(在XSLT 2.0中)返回"catalog cd" - 即所有节点的祖先名称的空格分隔列表。