用子树填充变量

时间:2019-01-23 16:24:35

标签: xslt

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 :(得分: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子元素。