在xsl中覆盖变量

4

我只需要覆盖 xsl 中的变量。

Example:
x=0
if x=0
then
x=3

我需要改变变量的值。

我对xsl非常陌生,请帮助我如何实现这个。这可能很傻,但我没有任何想法...


1
请提供一些 XML 代码,让我们知道您无法理解的内容是什么。您已经尝试过什么了吗? - Memos Electron
告诉我们你想要实现什么,我们会告诉你如何在不覆盖变量的情况下实现它。 - Michael Kay
3个回答

3

正如其他评论所指出的,XSLT中的变量一旦设置就无法修改。我发现最简单的方法是将变量嵌套在彼此之内。

<xsl:variable name="initial_condition" select="VALUE"/>

稍后

<xsl:variable name="modified_condition" select="$initial_condition + MODIFIER"/>

我们的一些XSL文件中有大量嵌套计算,这些计算实际上应该在生成源XML的业务逻辑中。由于曾经一段时间内没有开发人员/时间添加此业务逻辑,因此将其作为演示层的一部分添加了进来。

像这样的代码非常难以维护,特别是考虑到您可能需要进行控制流程的考虑。变量名称变得非常复杂,可读性急剧下降。这样的代码应该是最后的选择,它并不是XSLT设计的主要目的。


3

我只需要在xsl中覆盖变量

例如,如果x=0,则x=3

XSLT是一种函数式语言,在其他方面,这意味着一旦定义的变量就不能更改。

当然,这个事实并不意味着一个特定的问题不能使用XSLT来解决——只是解决方案不包含任何变量值的修改,一旦被定义了。

告诉我们你的具体问题,很多人都能提供XSLT解决方案 :)


1

xslt中的<xsl:variable>实际上不是一个变量。这意味着在定义后它不能被更改,并且可以像这样使用:

假设我们有一个名为test.xml的xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<client-list>
    <client>
        <name>person1</name>
    </client>
    <client>
        <name>person2</name>
    </client>
    <client>
        <name>person3</name>
    </client>
</client-list>

我们想将其转换为类似于 CSV(逗号分隔值)的格式,但是将 person1 替换为一个名为 person4 的隐藏人物。然后假设我们有一个名为 test.xsl 的 XML 文件,它将用于转换 test.xml

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

    <xsl:variable name="hiddenname">person4</xsl:variable>
<!-- this template is for the root tag client-list of the test.xml -->
    <xsl:template match="/client-list">
<!-- for each tag with name client you find, ... -->
        <xsl:for-each select="client">
<!-- if the tag with name -name- don't have the value person1 just place its data, ... -->
            <xsl:if test="name != 'person1'">
                <xsl:value-of select="name"/>
            </xsl:if>
<!-- if have the value person1 place the data from the hiddenperson -->
            <xsl:if test="name = 'person1'">
                <xsl:value-of select="$hiddenname"/>
            </xsl:if>
<!-- and place a comma -->
        <xsl:text>,</xsl:text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

结果将会是:

person4,person2,person3,

希望这能对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接