<xsl:value-of>使用连接变量获取字符串而不是值

时间:2017-03-14 13:33:32

标签: xml xslt xslt-1.0

我有一个包含N个项目的大量列表的XML,但我无法得到 节点值使用<xsl:variable>

我的XSL

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="my_list">
        <xsl:param name="num_items" select="my_items" />
        <xsl:call-template name="loop_items">
            <xsl:with-param name="count" select="$num_items"/>
        </xsl:call-template>
    </xsl:template>

    <xsl:template name="loop_items">
        <xsl:param name="count" select="1"/>
        <xsl:variable name="varname" select="concat('item0',$count,'_val')"/>
        <xsl:if test="$count > 0">
            <p>1- <xsl:value-of select='item01_val'/></p>
            <p>2- <xsl:value-of select="concat('item0',$count,'_val')" /></p>
            <p>3- <xsl:value-of select="$varname" /></p>
            <xsl:call-template name="loop_items">
                <xsl:with-param name="count" select="$count - 1"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

我的XML

<?xml version="1.0" encoding="UTF-8"?>
<my_list>
    <my_items>4</my_items>
    <item01_val>lorem</item_01_val>
    <item02_val>ipsum</item_02_val>
    <item03_val>dolor</item_03_val>
    <item04_val>sit</item_04_val>
</my_list>

我期待的结果:

1- lorem
2- lorem
3- lorem
1- ipsum
2- ipsum
3- ipsum
.....

我真正拥有的:

1-lorem
2-item01_val
3-item01_val
1-ipsum
2-item02_val
3-item02_val

如您所见,我正在获取字符串而不是节点值 我正在使用XSLT 1.0

1 个答案:

答案 0 :(得分:2)

指示:

<xsl:value-of select="concat('item0',$count,'_val')" />

返回由连接的子串组成的字符串; 将复合字符串计算为 XPath表达式

您可以使用以下内容从相应元素中获取值:

<xsl:value-of select="*[name() = concat('item0',$count,'_val')]" />

虽然给出了预期的结果,但我想知道你为什么不这样做:

<xsl:template match="my_list">
    <xsl:for-each select="*[starts-with(name(), 'item')]">
        <p>1- <xsl:value-of select="." /></p>
        <p>2- <xsl:value-of select="." /></p>
        <p>3- <xsl:value-of select="." /></p>
    </xsl:for-each>
</xsl:template>

完成。

相关问题