2013-02-22 137 views
1

我有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 
} 

我想一般的查询,我知道

美孚[@Tag = 'AA,BB' 或@Tag = 'BB']

将在此工作例。

回答

1

使用

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

如果trere是一个逗号和下一个值之间的空间,可以消除他们在下面的XPath表达式

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

XSLT - based based verification:

<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的说明。

+0

谢谢,真的很整洁的解决方案。 – 2013-02-25 03:11:02

+0

@WallstreetProgrammer,不客气。 – 2013-02-25 05:14:59

相关问题