我想检查节点值是否包含一个字符串,该字符串出现在变量为节点集的节点的属性中。
<xsl:variable name="Var">
<root>
<tag atr="x3"> some string <tag>
<tag atr="x4"> some string <tag>
<root>
<xsl:variable>
xml包含:
<name>one x3 two<name>
我试过这样的东西:
<xsl:value-of select="contains(name,msxsl:node-set($Var)/root/tag/@atr)"/>
但它只是输出什么都没有,然后继续前进。
在XPath 1.0中,如果函数或运算符需要一个字符串并传递给节点集,则该函数或运算符只生成和使用节点集的第一个(按文档顺序)节点的字符串值。
因此,一个表达式如:
contains(name, msxsl:node-set($Var)/root/tag/@atr)
仅测试CCD_ 1节点中的第一个的的字符串值是否包含在第一个CCD_ 2节点的字符串值中。
实际上,您想看看msxsl:node-set($Var)/root/tag/@atr
中任何节点的字符串值是否包含在一个名为name
的给定元素的字符串值中。
评估此条件的一个正确XPath表达式:
boolean(msxsl:node-set($Var)/root/tag/@atr[contains($name, .)])
其中CCD_ 5被定义为恰好包含元素CCD_。
完整的代码示例:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="name" select="'x42'"/>
<xsl:variable name="Var">
<root>
<tag atr="x3"> some string </tag>
<tag atr="x4"> some string </tag>
</root>
</xsl:variable>
<xsl:template match="/">
<xsl:value-of select=
"boolean(msxsl:node-set($Var)
/root/tag/@atr[contains($name, .)])"/>
</xsl:template>
</xsl:stylesheet>
当将此转换应用于任何XML文档(未使用)时,将生成所需的正确结果:
true
但是,如果我们在上面的转换中替换另一个答案中提供的XPath表达式(由Siva Charan提供):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="name" select="'x42'"/>
<xsl:variable name="Var">
<root>
<tag atr="x3"> some string </tag>
<tag atr="x4"> some string </tag>
</root>
</xsl:variable>
<xsl:template match="/">
<xsl:value-of select=
"contains(name, msxsl:node-set($Var)/root/tag/@atr)"/>
</xsl:template>
</xsl:stylesheet>
此转换产生错误答案:
false
因为它只测试所有CCD_ 7属性中的第一个属性的包含性。