имя узла не возвращает расширенное имя QName в XSLT - PullRequest
0 голосов
/ 26 мая 2020

Этот код должен печатать полный путь ко всем элементам и атрибутам в данных.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0" expand-text="yes">

   <xsl:output method="text"/>
   <xsl:template match="text()"/>

   <xsl:template match="*">
       {ancestor-or-self::*/concat(node-name(),'/')}<xsl:apply-templates select="@*|*"/>
   </xsl:template>
   <xsl:template match="@*">{'@' || node-name() || ','}</xsl:template>

 </xsl:stylesheet>

Итак, с этим вводом

<a:b xmlns:a="ans" xmlns:c="cns">
    <c:x/>
</a:b>

Я ожидаю

{ans}b
{ans}b/ {cns}x

точный интервал не имеет значения.

Я получаю вывод, как если бы я использовал функцию name () вместо имени узла, т.е.

a:b
a:b / c:x

Вероятно, есть работа- объединив local-name и namespace-uri, но я хотел бы знать, почему то, что опубликовано, не делает того, на что я надеялся.

1 Ответ

3 голосов
/ 26 мая 2020

Возможно, поможет функция path: <xsl:value-of select="descendant::*!path()" separator="&#10;"/>.

Или создайте нужный формат из namespace-uri-from-QName и local-name-fromQName:

<xsl:value-of select="descendant::*!string-join(ancestor-or-self::*!node-name()!('{' || namespace-uri-from-QName(.) || '}' || local-name-from-QName(.)), '/')" separator="&#10;"/>

https://xsltfiddle.liberty-development.net/naZXVFj

Что касается того, почему node-name() возвращает xs:QName, но его строковое значение дает формат, который вы видите, я думаю, что https://www.w3.org/TR/xpath-functions-31/#casting -to-string указывает на кастинг an xs:QName в строку:

Если ST - это xs: QName или xs: NOTATION:

, если у квалифицированного имени есть префикс, тогда TV - это конкатенация префикса SV, одно двоеточие (:) и локальное имя SV.

в противном случае TV - это локальное имя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...