2016-08-22 3 views
1

Я пытаюсь напечатать имя узла-предка, используя 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::*)"/> 

это дает мне ниже Exception

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

Имя какого предка? Если вы используете 'ancestor :: node()' в контексте элемента 'title', вы выбираете элемент' cd' и элемент 'catalog', а также узел документа, так как все они являются предковыми узлами. '' должен работать, чтобы вывести имя бабушки и дедушки. –

ответ

2

Ось ancestor содержит всех предков контекстного узла: его родитель, его прародитель, его прадед и т.д. вплоть до корневого узла.

Когда вы запрашиваете имя предка, вы должны выбрать один узлов на оси ancestor. Например:

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

вернется "catalog" в вашем примере (обратите внимание, что предок обратная ось).

Ото, это:

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

будет (в XSLT 2.0) возвращают "catalog cd" - то есть разделенный пробелами список всех имен предков узла.

Смежные вопросы