创建结果树片段变量

Create result tree fragment variable

我正在使用 xsl 样式表输出嵌入了 SVG 图表的 xsl:fo 文档。

我无法从输入中获取数组并将其拆分为几个较小的数组,存储在变量中,以便 SVG 模板可以应用于不同的数组以生成 3 个不同的图表。输入看起来像这样(请注意自定义 ns):

<root xmlns="http://xml.mynamespace.com">
    <data>
        <list>
            <item>
                <id>1</id>
                <title>Foo</title>
                <score>10</score>
            </item>
            <item>
                <id>2</id>
                <title>Bar</title>
                <score>6</score>
            </item>
            <item>
                <id>3</id>
                <title>Baz</title>
                <score>16</score>
            </item>
            <item>
                <id>4</id>
                <title>Fizz</title>
                <score>14</score>
            </item>
            <item>
                <id>5</id>
                <title>Buzz</title>
                <score>7</score>
            </item>
        </list>
    </data>
</root>

这些值可以分为 3 个不同的组。我正在尝试将数组 list 拆分为 3 个单独的变量,以便可以应用模板将它们转换为 SVG 图表。众所周知,SVG 变换适用于上述数组,因此我认为问题出在我尝试创建变量的方式上。我尝试了几种不同的方法,但我使用 xsl:copy-of as so (再次请注意 ns):

取得了最大的成功(如果你可以这样称呼它的话)
<xslt:stylesheet xmlns:m="http://xml.mynamespace.com" version="1.0">
    <xsl:variable name="group1">
        <xsl:element name="m:list">
            <xsl:copy-of select="/m:root/m:data/m:list/m:item[id &lt;= 3]"/>
        </xsl:element>
    </xsl:variable>
</xslt:stylesheet>

然后变量像这样使用:

<xsl:apply-templates select="msxsl:node-set($group1)/m:list" /> 

我将它们放在变量中的原因是因为创建 SVG 的模板期望输入格式为 <list> 并带有一个或多个子 item 元素。 SVG 转换模板如下:

<xsl:template match="m:list">
    <xsl:variable name="canvasHeight" select="28 * count(m:item)"/>
    <svg height="{$canvasHeight}">
        <xsl:for-each select="m:item">
            <!-- Draw bar here -->
        </xsl:for-each>
    </svg>
</xsl:template>

当我尝试将变量转换为 SVG 时的输出表明正确创建了 list 元素(因为模板匹配并且输出了 SVG 元素)但是 item 元素没有被复制,因为 for-each 似乎没有执行并且输出的高度为 0。

我是否错误地创建了变量 group1?或者有没有更简单的方法不需要将初始列表拆分为单独的变量?

嗯,对于 /m:root/m:data/m:list/m:item[Id &lt;= 3],您只是在谓词。