Xml 如何在Xpath中使用变量节点集;包含();功能

Xml 如何在Xpath中使用变量节点集;包含();功能,xml,xpath,xslt-1.0,Xml,Xpath,Xslt 1.0,我想检查节点值是否包含一个字符串,该字符串出现在作为节点集的in变量的节点属性中 <xsl:variable name="Var"> <root> <tag atr="x3"> some string <tag> <tag atr="x4"> some string <tag> <root> <xsl:variable> 一些绳子 一些绳子 xml包含: <name>o

我想检查节点值是否包含一个字符串,该字符串出现在作为节点集的in变量的节点属性中

<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> 
一个x3两个
我试过这样的方法:

<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)
仅测试
msxsl:node set($Var)/root/tag/@atr
节点中第一个
name
节点的字符串值是否包含在第一个
节点的字符串值中

实际上,您希望查看
msxsl:node set($Var)/root/tag/@atr
中任何节点的字符串值是否包含在指定元素的字符串值中,名为
name

计算此条件的一个正确XPath表达式

boolean(msxsl:node-set($Var)/root/tag/@atr[contains($name, .)])
<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>
true
false
其中
$name
定义为正好包含元素
name

完整的代码示例

boolean(msxsl:node-set($Var)/root/tag/@atr[contains($name, .)])
<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>
true
false
但是,如果我们在上述转换中替换另一个答案中提供的XPath表达式(由Siva Charan提供):

因为它只测试第一个
attr
属性的包含。

contains()
接受字符串参数,所以不能向其传递节点集。您需要单独检查节点集中的每个项目。