XSLT 变量问题

Posted

技术标签:

【中文标题】XSLT 变量问题【英文标题】:XSLT variable issue 【发布时间】:2013-08-09 04:21:50 【问题描述】:

我有一个 xml,我需要使用 xslt 2.0 对其进行转换以提供不同的输出 xml。 输出 xml 需要在输出 xml 字符串中包含 XSLT 变量的值。 但是 XSLT 变量值没有被拾取。

非常感谢您的帮助。提前致谢。

输入 xml:`

`<additionalParams> 
    <qryParam name = "rank" value = "300"/>
    <qryParam name = "id" value = "id1"/>
    <qryParam name = "max" value= "max1"/>
</additionalParams> 

预期输出 xml:

<additionalParameter name="rank" type="text">
   <value>"300"</value>
</additionalParameter>
<additionalParameter name="id" type="text">
   <value>"id1"</value>
</additionalParameter>
<additionalParameter name="max" type="text">
   <value>"max1"</value>
</additionalParameter>

当前 XSLT:

<xsl:for-each select="./additionalParams/qryParam">
    <xsl:variable name = "elmtName" select="@name"/>
    <xsl:variable name = "elmtValue" xsl:value-of select="@value"/>
    <additionalParameter name="$elmtName" type="text">
       <value>"$elmtValue"</value>
    </additionalParameter>
</xsl:for-each>

转换后的当前结果 xml - 它没有获取变量值。

<otherQueryParameters>
    <additionalParameter name="$elmtName" type="text">
    <value>"$elmtValue"</value>
    </additionalParameter>
    <additionalParameter name="$elmtName" type="text">
        <value>"$elmtValue"</value>
    </additionalParameter>
    <additionalParameter name="$elmtName" type="text">
        <value>"$elmtValue"</value>
    </additionalParameter>
</otherQueryParameters>

【问题讨论】:

【参考方案1】:

请注意,输出值的默认方式是 其中 xsl:value-of 是必须放在尖括号中的元素。您在 XSLT 代码的第 3 行中错过了这些,撇开这将是不可能的元素中的元素。相反,您可以使用属性值模板 (AVT) 将值放在大括号中。这并不适用于所有情况。在键入此内容时,Peter Rader 给出了一个正确答案,即在不必要的情况下应该去掉变量。您可以直接访问这些值:

<xsl:for-each select="./additionalParams/qryParam">
    <additionalParameter name="@name" type="text">
       <value><xsl:value-of select="@value"/></value>
    </additionalParameter>
</xsl:for-each>

【讨论】:

【参考方案2】:

试试这个 xslt:

<xsl:for-each select="./additionalParams/qryParam">
    <xsl:variable name = "elmtName" select="@name"/>
    <xsl:variable name = "elmtValue" select="@value"/>
    <additionalParameter name="$elmtName" type="text">
       <value><xsl:value-of select="$elmtValue"/></value>
    </additionalParameter>
</xsl:for-each>

【讨论】:

以上是关于XSLT 变量问题的主要内容,如果未能解决你的问题,请参考以下文章

XSLT - 创建一个应该包含唯一和排序数据的变量

XSLT 中的条件变量选择

如何在 XSLT 中打破 for-each 以及如何更新 XSLT 中的现有变量

XSLT - 使用隧道传递变量未按预期工作

XSLT:测试当前元素是不是匹配变量 xpath

xslt从变量中选择属性