1

我有很多变量,只有两种情况。我原来的方法超出了范围

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

IE。后来,与撒克逊人,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/>. 撒克逊命令行示例:java -jar saxon9he.jar -s:in.xml -xsl:in.xsl -o:out.html

4

2 回答 2

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"

于 2015-05-08T19:58:54.680 回答
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,每个配色方案都有不同的颜色组,但想法是相同的,并且完全避免了测试和变量。

于 2015-05-08T16:35:14.500 回答