Вернуть тип значения элемента из функции в XSLT - PullRequest
0 голосов
/ 14 сентября 2018

Это мой XML

<report>
    <format-inputs>
        <narrative-entity-ids>
            <entity id="28495795" type-cdf-meaning="DIAGNOSES"/>
            <entity id="28495741" type-cdf-meaning="DIAGNOSES"/>
            <entity id="28495471" type-cdf-meaning="DIAGNOSES"/>
        </narrative-entity-ids>
    </format-inputs>
</report> 

Я создаю функцию в commonFunction.xslt

<xsl:function name="cdocfx:createEntityIdList" >
        <xsl:param name="formatInputsNodes"/>

        <xsl:if test="fn:exists(n:report/n:format-inputs)"
        <xsl:variable name="entityIdList" as="element()*">
            <xsl:for-each select="$formatInputsNodes/n:narrative-entity-ids/n:entity">
                <Item><xsl:value-of select="@id"/></Item>
            </xsl:for-each>
        </xsl:variable>
       </xsl:if>

        <xsl:copy-of select="$entityIdList"/>

    </xsl:function>

Я вызываю эту функцию в другом xslt-файле, в который был включен commonFunction.xslt

<xsl:variable name="entityIdList" select="cdocfx:createEntityIdList(n:report/n:format-inputs)"/>

</xsl:variable>

Мой вопрос: переменная entityIdList должен быть типом значения элемента, но у него есть тип документа-узла, как мне этого добиться ??

1 Ответ

0 голосов
/ 14 сентября 2018

Пожалуйста, предоставьте минимальные, но полные образцы входных данных 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, поэтому я не уверен, почемувы говорите, что у вас есть узел документа.

...