首页 > 解决方案 > 在 foreach 循环中使用变量构建 XSLT 字符串

问题描述

我面临的问题对其他人来说可能很简单,但作为初学者 XSL - 我还没有找到合适的解决方案。我想要做的是通过连接在 for-each 循环中定义的变量的结果来构建一个字符串。

对不起,应该是这样的:

<linked-hash-map>
<entry>
    <string>properties</string>
    <list>
        <linked-hash-map>
            <entry>
                <string>property_id</string>
                <int>123</int>
            </entry>
            <entry>
                <string>type</string>
                <string>H</string>
            </entry>
            <entry>
                <string>status</string>
                <string>CURRENT</string>
            </entry>
            <entry>
                <string>description</string>
                <string>Test</string>
            </entry>
            <entry>
                <string>lots</string>
                <list>
                    <linked-hash-map>
                        <entry>
                            <string>lot_id</string>
                            <int>123</int>
                        </entry>
                        <entry>
                            <string>lot_number</string>
                            <int>11</int>
                        </entry>
                        <entry>
                            <string>plan_number</string>
                            <int>100</int>
                        </entry>
                        <entry>
                            <string>plan_type</string>
                            <string>CC</string>
                        </entry>
                        <entry>
                            <string>plan_id</string>
                            <int>1</int>
                        </entry>
                    </linked-hash-map>
                </list>
            </entry>
        </linked-hash-map>
    </list>
</entry>

所需输出:SP - 31 - 108661

所以基本上我想将plan_typelot_numberplan_number连接成一个字符串。

我试过这个:

<xsl:for-each select="linked-hash-map/entry/linked-hash-map/entry/list/linked-hash-map/entry" >
    <xsl:choose>
        <!-- LOT NUMBER -->
        <xsl:when test="string[1] = 'lot_number'">
            <xsl:variable name="lot_number" select="int" />
        </xsl:when>
        <!-- PLAN NUMBER -->
        <xsl:when test="string[1] = 'plan_number'">
            <xsl:variable name="plan_number" select="int" />
        </xsl:when>
        <!-- PLAN TYPE -->
        <xsl:when test="string[1] = 'plan_type'">
            <xsl:variable name="plan_type" select="string[2]" />
        </xsl:when>
    </xsl:choose>
</xsl:for-each>

<!-- LOT DETAIL -->
// concatenate string in here.
<xsl:value-of select="concat($plan_type, '-', $lot_number, '-', $plan_number)" />

但它不起作用,因为变量超出范围。我怎样才能实现所需的输出?谢谢你。

标签: xslt

解决方案


请注意,变量在声明它们的块的范围内是局部的,因此在这种情况下,每个变量只能在xsl:when

但是这里不需要xsl:for-each或变量。你可以做这样的事情(假设你在模板匹配linked-hash-map

<xsl:value-of select="concat(entry[string[1]='plan_type']/string[2], '-', entry[string[1]='lot_number']/int, '-', entry[string[1]='plan_number']/int)" />

或者,为了使其更具可读性,将这些行分开

<xsl:value-of select="entry[string[1]='plan_type']/string[2]" />
<xsl:text>-</xsl:text>
<xsl:value-of select="entry[string[1]='lot_number']/int" />
<xsl:text>-</xsl:text>
<xsl:value-of select="entry[string[1]='plan_number']/int" />

http://xsltfiddle.liberty-development.net/eiZQaGs/2


推荐阅读