xslt将所有节点复制到变量

时间:2016-05-24 12:18:00

标签: xml xslt

如何为变量分配包含一组节点的另一个变量的副本? 这是我的代码:

echo $address.'<br>Lat: '.$lat.'<br>Long: '.$long;

我定义了另一个变量,因为后来它被用作每个循环计数器。

    <xsl:variable name="btchs" select="$idoc/E1EDL20/E1EDL24[./HIPOS != 0]"></xsl:variable>
    <xsl:variable name="lines" select="$idoc/E1EDL20/E1EDL24[./HIPOS = 0]"></xsl:variable>
    <xsl:variable name="cnt" select="count($btchs)"></xsl:variable>
    <xsl:variable name="blines">
        <xsl:choose>
            <xsl:when test="$cnt=0">
                Here I want to make a copy all nodes of $lines variable
            </xsl:when>
            <xsl:otherwise>
                Here I want to make a copy all nodes of $btchs variable             
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>

2 个答案:

答案 0 :(得分:2)

这取决于您是使用XSLT-1.0还是XSLT-2.0。

在XSLT-1.0中,以下quote is determinative

  

在XSLT 1.0中,结果树片段(RTF)类型就像一个节点集,但它实际上是一个二等公民。每当使用xsl:variable构造临时树时,都会获得RTF。问题是你不能使用XPath表达式访问这棵树的内部,除非你使用特定于供应商的扩展函数,通常称为node-set(),将RTF转换为第一个-class node-set(由一个根节点组成)。

因此,在XSLT-1.0中,您只能获得一个无法通过进一步的XPath查询查询的RTF,因此无法满足您的需求。

回到问题的核心,以下规则适用于您的XSL版本:

  • 1.0:<xsl:variable name="abc" select="..." /> - &gt;可查询
  • 1.0:<xsl:variable name="bcd"><xsl:whatever-function>...</xsl:whatever-function> - &gt; 无法查询
  • 2.0:<xsl:variable name="abc" select="..." /> - &gt;可查询
  • 2.0:<xsl:variable name="bcd"><xsl:whatever-function>...</xsl:whatever-function> - &gt; queryable - 确实将该变量中的所有节点作为树返回。

概要:您无法使复杂构造的XSLT-1.0变量包含树的完全可查询子集!

答案 1 :(得分:2)

查看您的XSLT片段,看起来您希望blines变量包含E1EDL24不为零的所有HIPOS元素,如果不存在这样的元素,则应包含E1EDL24为零的所有HIPOS

如果是这种情况,您可以按如下方式定义blines变量,而不是尝试复制变量中的元素:

<xsl:variable name="blines" select="$btchs|$lines[not($btchs)]" />

这将引用源XML中的原始元素,而不是创建结果树片段,因此仍然可以查询。