XSLT - 数组和迭代

时间:2015-06-17 08:07:14

标签: xslt

如何创建数组并迭代它并获取其值?

示例:

<xsl:variable name="element">
    <xsl:for-each select="document/items/item">
            <item>
                <xsl:choose>
                    <xsl:when test="/@attr">1</xsl:when>
                    <xsl:otherwise>0</xsl:otherwise>
                </xsl:choose>
            </item>
        </xsl:for-each>
</xsl:variable>

<xsl:for-each select="$element">
    <p><xsl:value-of select="."/></p>
</xsl:for-each>

实际输出:

<p>0100</p>

应该是:

<p>0</p>
<p>1</p>
<p>0</p>
<p>0</p>

编辑:应该动态生成数组!

2 个答案:

答案 0 :(得分:0)

鉴于

<xsl:variable name="element">
    <xsl:for-each select="document/items/item">
            <item>
                <xsl:choose>
                    <xsl:when test="/@attr">1</xsl:when>
                    <xsl:otherwise>0</xsl:otherwise>
                </xsl:choose>
            </item>
        </xsl:for-each>
</xsl:variable>

和XSLT 1.0处理器你的变量是结果树片段类型,你只能使用<xsl:copy-of select="$element"/><xsl:value-of select="$element"/>或者你需要使用像exsl:node-set这样的扩展函数来将结果树片段转换为节点集,以便

<xsl:for-each select="exsl:node-set($element)/item">
    <p><xsl:value-of select="."/></p>
</xsl:for-each>

应该(在样式表中声明xmlns:exsl="http://exslt.org/common")。

使用XSLT 2.0或3.0,您的变量是一个临时树,其根节点包含一些item元素,因此您不需要扩展函数,但需要解决item元素,例如< / p>

<xsl:for-each select="$element/item">
    <p><xsl:value-of select="."/></p>
</xsl:for-each>

作为XSLT 2.0 / 3.0的替代方案,您可以将变量声明更改为

<xsl:variable name="element" as="element(item)*">
    <xsl:for-each select="document/items/item">
            <item>
                <xsl:choose>
                    <xsl:when test="/@attr">1</xsl:when>
                    <xsl:otherwise>0</xsl:otherwise>
                </xsl:choose>
            </item>
        </xsl:for-each>
</xsl:variable>

要有一个item元素序列的变量,在这种情况下你的

<xsl:for-each select="$element">
    <p><xsl:value-of select="."/></p>
</xsl:for-each>

会做你想做的事。

XSLT 1.0或2.0中没有数组。

答案 1 :(得分:0)

@Pali,

请分享需要转换的XML。 IT会有所帮助。

XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:for-each select="document/items/item">
<item>
<xsl:choose>
 <p>
<xsl:when test="/@attr">1</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
 </p>
 </xsl:choose>
  </item>
  </xsl:for-each>
</xsl:variable>
 </xsl:template>
</xsl:stylesheet>