我尝试使用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())"
名称。
由于
答案 0 :(得分:2)
ancestor
轴包含上下文节点的所有祖先:其父级,祖父级,曾祖父母等,一直到根节点。
当您要求提供祖先的名称时,您必须在ancestor
轴上选择一个的节点。例如:
<xsl:value-of select="name(ancestor::*[last()])"/>
将在您的示例中返回"catalog"
(请注意,祖先是反向轴)。
OTOH,这:
<xsl:value-of select="ancestor::*/name()"/>
将(在XSLT 2.0中)返回"catalog cd"
- 即所有节点的祖先名称的空格分隔列表。