gpt4 book ai didi

xml - 如何在 Xpath "contains()"函数中使用变量节点集

转载 作者:行者123 更新时间:2023-12-03 16:12:33 27 4
gpt4 key购买 nike

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

<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)

只测试 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, .)])

其中 $name 被定义为恰好包含元素 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>

当此转换应用于任何 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

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

关于xml - 如何在 Xpath "contains()"函数中使用变量节点集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9589209/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com