7

私は小さな問題で立ち往生しています。

XSLファイル:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0"  
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/xpath-functions"> 
<xsl:template match="/"> 


<xsl:variable name="unumericValue" select="10" />
<xsl:variable name="uanotherValue" select="8" />



<xsl:for-each select="/root/try">
<xsl:value-of select="var" />
<xsl:variable name="min"><xsl:value-of select="@minimum" /></xsl:variable>
<xsl:value-of select="@type" />
<xsl:variable name="referenceName"><xsl:value-of select='concat("u",var)' /></xsl:variable>
<xsl:value-of select="$referenceName" />
<xsl:if test='$referenceName > $min'>
<p>Do something.</p>
</xsl:if>
</xsl:for-each>

</xsl:template>
</xsl:stylesheet>

XMLファイル:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="q1.xsl"?>
<root>
<try type="compare" minimum="9">
<var>numericValue</var>
<something>...</something>
</try>

<try type="compare" minimum="10">
<var>anotherValue</var>
<something>...</something>
</try>
</root>

ご覧のとおり、XMLファイルには2つのvar-Elementがあり、XSLT-Fileの変数と一致する必要があります。しかし、どの構文が正しいのかわかりません。$ referenceNameは、使用したい変数の名前です。しかし、名前を既存の変数に参照する方法がわかりません。

4

3 に答える 3

11

$referenceName「unumericValue」などの名前の変数への参照ではありません。これは文字列値「unumericValue」などです。したがって、これが。より大きくなることはありません$min。ただし、少し余分な作業を行うと、名前で変数を見つけるためのトリックがあります。

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

  <xsl:variable name="numericValue" select="10" />
  <xsl:variable name="anotherValue" select="8" />
  <xsl:variable name="vars" select="document('')/*/xsl:variable" />

  <xsl:template match="/">
    <xsl:variable name="referenceName" select="'numericValue'" />
    <xsl:variable name="referenceValue" select="$vars[@name = $referenceName]/@select" />
    Reference value: <xsl:value-of select="$referenceValue" />
  </xsl:template>
</xsl:stylesheet>

ここで注意すべき大きな制限の1つは、これは定数の数値である変数に対してのみ機能することです。

定数文字列値で変数をシミュレートする方法は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                 xmlns:v="variables-node"
>
  <v:variables>
    <v:variable n="numericValue" value="10" />
    <v:variable n="nonNumericValue" value="Hello World" />
  </v:variables>
  <xsl:variable name="vars" select="document('')//v:variables/v:variable" />

    <xsl:template match="/">
      <xsl:variable name="referenceName" select="'nonNumericValue'" />
      <xsl:variable name="referenceValue" select="$vars[@n = $referenceName]/@value" />
      <xsl:value-of select="concat('The variable with the name ', $referenceName, ' has the value ', $referenceValue)"/>
    </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"
                xmlns:exslt="http://exslt.org/common"
>

  <xsl:variable name="varsRaw">
    <var n="computedValue" value="{concat('2 + 4 is ', 2 + 4)}" />
    <var n="computedNumber" value="{22 div 7}" />
  </xsl:variable>
  <xsl:variable name="vars" select="exslt:node-set($varsRaw)/var" />

    <xsl:template match="/">
      <xsl:variable name="referenceName" select="'computedValue'" />
      <xsl:variable name="referenceValue" select="$vars[@n = $referenceName]/@value" />
      <xsl:value-of select="concat('The variable with the name ', $referenceName, ' has the value ', $referenceValue)"/>

      <xsl:value-of select="'     '"/>

      <xsl:variable name="referenceName2" select="'computedNumber'" />
      <xsl:variable name="referenceValue2" select="$vars[@n = $referenceName2]/@value" />
      <xsl:value-of select="concat('The variable with the name ', $referenceName2, ' has the value ', $referenceValue2)"/>
    </xsl:template>
</xsl:stylesheet>

最後のアプローチは、おそらく実際には最もオーソドックスですが、XSLTプロセッサに依存する(少なくともXSLT 1.0では)node-set()関数が必要です。

于 2013-01-10T17:37:05.363 に答える
6

ちなみに、これをしないでください:

<xsl:variable name="min"><xsl:value-of select="@minimum" /></xsl:variable>

あなたがこれを行うことができるとき:

<xsl:variable name="min" select="@minimum" />

冗長であるだけでなく、非効率的でもあります。既存のノードへの参照だけが必要な場合は、データをコピーして新しいツリーを構築する必要はありません。これは非常にコストのかかる操作です。

于 2013-01-10T22:11:58.313 に答える
1

ほとんどのプログラミング言語と同様に、実行時にXSLT変数名にアクセスすることはできません。変数は実行時に存在しない場合もあります。オプティマイザーは、変数が使用されるポイントで変数へのすべての参照をインライン化するなど、あらゆる種類のトリックを実行できます。

最善のアプローチは、標準名の変数を用意し、それにXMLコンテンツを与えることです。XMLの要素名と属性名は、変数名とは異なり、実行時にアクセスできます。

于 2013-01-10T21:46:31.870 に答える