在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>
答案 0 :(得分:2)
您只需选择<xsl:variable name="obj" select="/t:Flow/t:FHeader/t:Producer/t:Repository[current()/t:ReferencedObjectType='Asset']"/>
。或者,如Tim所言,请使用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
条件表达式,因此您可能不需要带有xsl:choose/xsl:when
的XSLT,但可以使用<xsl:variable name="obj" select="if (t:ReferencedObjectType='Asset']) then /t:Flow/t:FHeader/t:Producer else if (...) then ... else ()"/>
,那样您可以选择例如输入t:Producer
元素,如果您使用变量,则可以直接选择t:Repository
子元素。