Пожалуйста, предоставьте минимальные, но полные образцы входных данных XML, XSLT, который вы имеете, выходных данных, которые вы хотите, и тот, который вы получаете вместе с любыми точными сообщениями об ошибках, с которыми вы столкнулись.
В настоящее время я не уверен, что понимаю, чего вы хотите достичь, если вы создаете переменную типа element()*
, вы, похоже, хотите создать последовательность узлов элементов.Любой xsl:value-of
, однако, будет выводить только строковые значения выбранных элементов в текстовом узле, поэтому неясно, почему вы сначала создаете элементы, если хотите вывести только строковые значения.Если вы создаете узлы и хотите выводить их, используйте xsl:copy-of
или xsl:sequence
, а не xsl:value-of
.
Чтобы показать два примера написания функции, которая возвращает последовательность элементов (т. Е. Результат имеет типelement()*
) Я установил https://xsltfiddle.liberty -development.net / 3NzcBtE , который имеет две функции
<xsl:function name="mf:ex1">
<xsl:param name="input" as="element()*"/>
<xsl:for-each select="$input">
<item>{ @id }</item>
</xsl:for-each>
</xsl:function>
<xsl:function name="mf:ex2">
<xsl:param name="input" as="element()*"/>
<xsl:variable name="elements" as="element()*">
<xsl:for-each select="$input">
<item>{ @id }</item>
</xsl:for-each>
</xsl:variable>
<xsl:sequence select="$elements"/>
</xsl:function>
первая просто напрямую создает некоторые элементы результата в теле функции, чтоТаким образом, результатом является последовательность узлов элементов.Вторая функция использует ваш подход построения последовательности узлов элементов в переменной, правильный способ вернуть значение этой переменной из функции - использовать xsl:sequence
.
Не ясно, в каком положенииопубликованный код, который, по вашему мнению, имеет дело с document-node()
узлом.
Обратите также внимание на то, что
<xsl:choose>
<xsl:when test="fn:exists($formatInputsNodes/n:narrative-entity-ids)">
<xsl:for-each select="$formatInputsNodes/n:narrative-entity-ids/n:entity">
<Item><xsl:value-of select="@id"/></Item>
</xsl:for-each>
</xsl:when>
</xsl:choose>
можно упростить до
<xsl:for-each select="$formatInputsNodes/n:narrative-entity-ids/n:entity">
<Item><xsl:value-of select="@id"/></Item>
</xsl:for-each>
.XML-вход, который по крайней мере правильно сформирован, и некоторые фрагменты XSLT (которые, к сожалению, не правильно сформированы и, кажется, используют пространство имен, хотя показанный ввод XML не использует его) здесь - это попытка преобразовать это в рабочий образец
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:cdocfx="http://example.com/cdox-functions"
exclude-result-prefixes="#all"
version="3.0">
<xsl:function name="cdocfx:createEntityIdList" >
<xsl:param name="formatInputsNodes"/>
<xsl:variable name="entityIdList" as="element()*">
<xsl:for-each select="$formatInputsNodes/narrative-entity-ids/entity">
<Item><xsl:value-of select="@id"/></Item>
</xsl:for-each>
</xsl:variable>
<xsl:copy-of select="$entityIdList"/>
</xsl:function>
<xsl:variable name="entityIdList" select="cdocfx:createEntityIdList(report/format-inputs)"/>
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:value-of select="$entityIdList instance of element()*, $entityIdList" separator=", "/>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty -development.net / pPqsHTW / 1
Выход для чека $entityIdList instance of element()*
равен true
, поэтому я не уверен, почемувы говорите, что у вас есть узел документа.