使用具有多个值的属性选择元素

时间:2013-02-22 22:21:14

标签: .net xpath

我的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']

可以在这个例子中使用。

1 个答案:

答案 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 的插图。