1

多くの変数があり、2 つのケースしかありません。私の元のアプローチは範囲外です:

<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

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" />。このように、値の配列であるかのように、単一の変数を処理します。

exslPS: スタイルシートのルート タグに、名前空間宣言を追加することを忘れないでください。xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl"

于 2015-05-08T19:58:54.680 に答える