创建结果树片段变量

时间:2015-07-07 11:41:43

标签: c# .net xslt xslt-1.0

我正在使用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取得了最大的成功(如果你可以称之为)(再次,请注意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元素不是&# 39; t复制,因为for-each似乎没有执行,输出高度为0.

我是否错误地创建了变量group1?或者是否有一种更简单的方法可以将初始列表拆分为单独的变量?

1 个答案:

答案 0 :(得分:1)

对于/m:root/m:data/m:list/m:item[Id &lt;= 3],你只是在谓词中遇到了错误的情况(Idid)和错误的命名空间(无对m:id)。