Заполните переменную поддеревом - PullRequest
0 голосов
/ 23 января 2019

в таблице стилей version="2.0":

следующий код выдает правильный вывод

<xsl:variable name="obj">
  <xsl:choose>
    <xsl:when test="t:ReferencedObjectType='Asset'">
      <xsl:value-of select="/t:Flow/t:FHeader/t:Producer/t:Repository" />
    </xsl:when>
  </xsl:choose>
</xsl:variable>
<xsl:choose>
<xsl:value-of select="$obj"/>

, но этот код не

<xsl:variable name="obj">
  <xsl:choose>
    <xsl:when test="t:ReferencedObjectType='Asset'">
      <xsl:value-of select="/t:Flow/t:FHeader/t:Producer" />
    </xsl:when>
  </xsl:choose>
</xsl:variable>
<xsl:choose>
<xsl:value-of select="$obj/t:Repository"/>

Как получитьвторой код для запуска, как ожидалось?Если необходимо, есть ли решение в v3?


этот код не запускается либо

<xsl:variable name="obj">
  <xsl:choose>
    <xsl:when test="t:ReferencedObjectType='Asset'">
      <xsl:copy-of select="/t:Flow/t:FHeader/t:Producer" />
    </xsl:when>
  </xsl:choose>
</xsl:variable>
<xsl:choose>
<xsl:value-of select="$obj/t:Repository"/>

соответствующий ввод XML

<Flow>
  <FHeader>
    <Producer>
      <Repository>tests.com</Repository>
    </Producer>
  </FHeader>
</Flow>

1 Ответ

0 голосов
/ 23 января 2019

Вы можете просто выбрать <xsl:variable name="obj" select="/t:Flow/t:FHeader/t:Producer/t:Repository[current()/t:ReferencedObjectType='Asset']"/>.Или, как уже прокомментировал Тим, используйте xsl:copy-of, также принимая во внимание, что вам позже понадобится, например, $obj/t:Producer/t:Repository, чтобы выбрать правильный уровень.

Или узнайте об атрибуте as и используйте, например, <xsl:variable name="obj" as="element()*">...<xsl:copy-of select="/t:Flow/t:FHeader/t:Producer"/> ...</xsl:variable>, затем вы можете использовать, например, $obj/t:Repository.

Также есть xsl:sequence для выбора входных узлов вместоих копирование, в частности, с помощью xsl:variable, если вы используете атрибут as.Это может потреблять меньше памяти.

Кроме того, XPath 2 и более поздние версии имеют if (condition-expression) then expression else expression условных выражений на уровне выражений, поэтому вам может не потребоваться XSLT с xsl:choose/xsl:when, но вы можете использовать <xsl:variable name="obj" select="if (t:ReferencedObjectType='Asset']) then /t:Flow/t:FHeader/t:Producer else if (...) then ... else ()"/>, так что вы выбрали бынапример, элемент input t:Producer в любом случае, и если вы используете переменную, вы можете напрямую выбрать t:Repository child.

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