我的xml包含带逗号分隔值的属性。我知道这不是一个好主意,但暂时坚持下去。
我喜欢使用XPath选择具有匹配属性值的元素。我希望匹配只考虑完整值,而不是部分匹配。是否可以使用XPath执行此操作?
例如,请参阅下面的C#代码。我使用.NET 4.0。
string xml = @"<Foos>
<Foo Tag=""AA, BB"" />
<Foo Tag=""BB"" />
<Foo Tag=""AAA, BBB"" />
</Foos>";
using (StringReader reader = new StringReader(xml))
{
XElement doc = XElement.Load(reader);
// I like to select elements with tag BB:
// <Foo Tag=""AA, BB"" />
// <Foo Tag=""BB"" />
var fooElementsWithTagBB = doc.XPathSelectElements("//Foo[@Tag = 'BB']"); // Selects only <Foo Tag=""BB"" />
fooElementsWithTagBB = doc.XPathSelectElements("//Foo[contains(@Tag, 'BB')]"); // Selects all elements
}
我想要一般性查询,我知道
Foo [@Tag ='AA,BB'或@Tag ='BB']
可以在这个例子中使用。
答案 0 :(得分:1)
使用强>:
//Foo[contains(concat(',',@Tag, ','), ',BB,')]
如果trere是逗号和下一个值之间的空格,则可以将其删除,如下面的XPath表达式:
//Foo[contains(concat(',',translate(@Tag, ' ', ''), ','), ',BB,')]
基于XSLT的验证:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy-of select=
"//Foo[contains(concat(',',translate(@Tag, ' ', ''), ','), ',BB,')]"/>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<Foos>
<Foo Tag="AA, BB"/>
<Foo Tag="BB" />
<Foo Tag="AAA, BBB" />
</Foos>
评估XPath表达式并将此评估结果(所选节点)复制到输出:
<Foo Tag="AA, BB"/>
<Foo Tag="BB"/>
<强>解释强>:
这是 sentinel programming 的插图。