Вы можете просто выбрать <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.