私は、Apache cocoonを使用してXMLをPDFに変換するアプリケーションに取り組んでおり、入力XMLを処理するXSLを再設計しています。
現在XSLには、次のようなコードがあります
<xsl:variable name="variable1">
<xsl:choose>
<xsl:when test="$testVariable ='1'">
<xsl:value-of select="'A'"/>
</xsl:when>
<xsl:when test="$testVariable ='1'">
<xsl:value-of select="'B'"/>
</xsl:when>
</xsl:choose>
</xsl:variable>
<xsl:variable name="variable2">
<xsl:choose>
<xsl:when test="$testVariable ='1'">
<xsl:value-of select="'X'"/>
</xsl:when>
<xsl:when test="$testVariable ='1'">
<xsl:value-of select="'Y'"/>
</xsl:when>
</xsl:choose>
</xsl:variable>
これに変更しても機能しますか?
<xsl:variable name="variable1"/>
<xsl:variable name="variable2"/>
<xsl:choose>
<xsl:when test="$testVariable ='1'">
<xsl:variable name="variable1" select="'A'">
<xsl:variable name="variable2" select="'X'">
</xsl:when>
<xsl:when test="$testVariable ='2'">
<xsl:variable name="variable1" select="'B'">
<xsl:variable name="variable2" select="'Y'">
</xsl:when>
</xsl:choose>
いいえ、他の多くの言語とは異なり、XSLT変数は作成後に値を変更できません。ただし、次のような手法を使用すると、無関係なコードを回避できます。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:variable name="mapping">
<item key="1" v1="A" v2="B" />
<item key="2" v1="X" v2="Y" />
</xsl:variable>
<xsl:variable name="mappingNode"
select="document('')//xsl:variable[@name = 'mapping']" />
<xsl:template match="....">
<xsl:variable name="testVariable" select="'1'" />
<xsl:variable name="values" select="$mappingNode/item[@key = $testVariable]" />
<xsl:variable name="variable1" select="$values/@v1" />
<xsl:variable name="variable2" select="$values/@v2" />
</xsl:template>
</xsl:stylesheet>
実際、values
変数を取得したら、variable1
およびvariable2
変数を個別に必要とすることさえできません。代わりに$values/@v1
と$values/@v2
を使用できます。