2

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

在这个例子中可以工作。

4

1 回答 1

1

使用

//Foo[contains(concat(',',@Tag, ','), ',BB,')]

如果逗号和下一个值之间有空格,您可以按照以下 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"/>

说明

这是哨兵编程的一个例证。

于 2013-02-23T06:10:47.743 回答