我遇到了一个小问题.
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文件有两个var-Elements,它们应与XSLT-File中的变量匹配.但是我不知道哪个语法是正确的.
$referenceName只是我想要使用的变量的名称.但我不知道如何将名称引用到现有变量.
$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>
这里要注意的一个很大的限制是,这只适用于恒定数值的变量.
这是一种使用常量字符串值模拟变量的方法:
<?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 ',$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,$referenceValue2)"/> </xsl:template> </xsl:stylesheet>