2

カンマで区切られた値を持つ属性を含むxmlがあります。これは良い考えではないことは承知していますが、今のところはこれに固執しています。

XPathを使用して、属性値が一致する要素を選択するのが好きです。部分一致ではなく、完全な値のみを考慮して一致させたい。XPathでこれを行うことは可能ですか?

たとえば、以下のC#コードを参照してください。.NET4.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,')]

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"/>

説明

これはセンチネルプログラミングの図です。

于 2013-02-23T06:10:47.743 に答える