xslt在范围内保留多个变量,具体取决于单个测试

时间:2015-05-08 11:16:32

标签: xslt scope xsl-choose

我有很多变数,只有两个案例。 我原来的方法超出范围

<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... -->

有没有办法让变量保持在范围内,但也不要重复自己?

更新1

根据请求添加完整的'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

2 个答案:

答案 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,每种颜色方案都有不同的颜色组,但这个想法是一样的,完全避免了测试和变量。