我有很多变数,只有两个案例。 我原来的方法超出范围:
<xsl:choose>
<xsl:when test='$something = 6'>
<xsl:variable name="foo">x</xsl:variable>
<!-- 50 other variables -->
</xsl:when>
<xsl:when test='$something = 7'>
<xsl:variable name="foo">y</xsl:variable>
<!-- 50 other variables -->
</xsl:when>
</xsl:choose>
即。之后,使用撒克逊,XPST0008: Variable x has not been declared (or its declaration is not in scope)
我认为如果我在xsl:variable
标签内选择它会起作用,但是测试会一遍又一遍地反复重复:
<xsl:variable name="foo">
<xsl:choose>
<xsl:when test='$something = 6'>x</xsl:when>
<xsl:when test='$something = 7'>y</xsl:when>
</xsl:choose>
</xsl:variable>
<!-- 50 other variables, the two tests repeated for each... -->
有没有办法让变量保持在范围内,但也不要重复自己?
根据请求添加完整的'sscce'文件
原创方法:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:variable name="something">6</xsl:variable>
<xsl:choose>
<xsl:when test="$something = '6'">
<xsl:variable name="foo">x</xsl:variable>
<!-- 50 other variables -->
</xsl:when>
<xsl:when test="$something = '7'">
<xsl:variable name="foo">y</xsl:variable>
<!-- 50 other variables -->
</xsl:when>
</xsl:choose>
<xsl:value-of select="$foo"/>
</xsl:template>
</xsl:stylesheet>
方法有效,但强迫自己重复:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:variable name="something">6</xsl:variable>
<xsl:variable name="foo">
<xsl:choose>
<xsl:when test='$something = 6'>x</xsl:when>
<xsl:when test='$something = 7'>y</xsl:when>
</xsl:choose>
</xsl:variable>
<!-- 50 other variables, the two tests repeated for each... -->
<xsl:value-of select="$foo"/>
</xsl:template>
</xsl:stylesheet>
示例xml文件:<xml/>
。示例saxon命令行:java -jar saxon9he.jar -s:in.xml -xsl:in.xsl -o:out.html
答案 0 :(得分:2)
好吧,我宁愿那样处理:
<xsl:variable name="something">6</xsl:variable>
<xsl:variable name="var.set">
<xsl:choose>
<xsl:when test="$something = '6'">
<foo>x</foo>
<bar>xx</bar>
<!-- 50 other variables, to be inserted as tag -->
</xsl:when>
<xsl:when test="$something = '7'">
<foo>y</foo>
<bar>yy</bar>
<!-- 50 other variables, to be inserted as tag -->
</xsl:when>
</xsl:choose>
</xsl:variable>
变量var.set
将是您可以通过exsl:node-set()
扩展程序阅读的节点集。
例如,要检索foo
的值(存储为节点而不是变量),请使用以下内容:<xsl:value-of select="exsl:node-set($var.set)/foo" />
。像这样你将处理一个变量,就好像它是一个值数组。
PS:在样式表的根标签上,不要忘记添加exsl
名称空间声明xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl"
答案 1 :(得分:1)
如果您事先了解了映射,则可以将它们存储在自己的文件中。
所以不要有这样的东西
<xsl:variable name="var1">
<xsl:if test="something = 5">x</xsl:if>
</xsl:variable>
<xsl:value-of select="$var1"/>
你可以拥有这个
<xsl:value-of select="document('other.xml')/root/scheme[@number = 5]/@value"/>
将此作为other.xml
<root>
<scheme number="5" value="x"/>
<scheme number="6" value="y"/>
</root>
你可能想要一个更复杂的other.xml,每种颜色方案都有不同的颜色组,但这个想法是一样的,完全避免了测试和变量。