4

私は XPATH にかなり慣れていないので、特定のノードが 2 つの値のいずれかと等しい場合に、複数の XML オブジェクトから値を返す必要があります。ソリューションは、local-name() を使用して名前空間に依存しない必要もあります。次の XML が与えられた場合、「A」が「4」または「5」のいずれかに等しい「B」のすべての値を返すことを検討しています。

<?xml version="1.0"?>
    <element>
        <A>3</A>
        <B>Value 1</B>
    </element>
    <element>
        <A>4</A>
        <B>Value 2</B>
    </element>
    <element>
        <A>5</A>
        <B>Value 3</B>
    </element>

次の式を何度も繰り返してみましたが、「A」の 2 番目の値を追加しようとすると、正しい構文を取得できないようです。「または」式の正しい構文を理解できないようです。ユニオンの使用も検討しましたが、その構文も正しくありませんでした。

これは、「A」が「4」の単一の値に等しい場合に機能しますが、「5」の値のテストを追加して、結果が「B」の 2 つの値 (「値 2」と「値 3」) を返すようにする方法)?

//*[local-name()='element'][*[local-name()='A']='4']/*[local-name()='B']/text()

ありがとうございました。どんな助けでも大歓迎です!

4

3 に答える 3

5

これを試して:

//*[local-name() = 'element']/*[local-name() = 'A' and (. = 4 or . = 5)]
    /../*[local-name() = 'B']

この式は と を選択Value 2Value 3ます。

于 2012-11-19T23:06:37.737 に答える
3

名前空間を処理する適切な方法は、それらを XPath APIに登録し、... XPath 式で使用することです。

使用:

//x:element[x:A = 4 or x:A = 5]/x:B

XSLT ベースの検証:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="some:default NS">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
     <xsl:copy-of select="//x:element[x:A = 4 or x:A = 5]/x:B"/>
 </xsl:template>
</xsl:stylesheet>

この変換が次の XML ドキュメント(既定の名前空間定義を持つ単一の最上位要素でラップされた提供されたフラグメント) に適用される場合:

<t xmlns="some:default NS">
    <element>
        <A>3</A>
        <B>Value 1</B>
    </element>
    <element>
        <A>4</A>
        <B>Value 2</B>
    </element>
    <element>
        <A>5</A>
        <B>Value 3</B>
    </element>
</t>

XPath 式が評価され、この評価の結果 (選択されたノード) が出力にコピーされます

<B xmlns="some:default NS">Value 2</B>
<B xmlns="some:default NS">Value 3</B>
于 2012-11-19T23:32:35.973 に答える
1

述語をネストできます。

//*[
  local-name() = 'element' and *[local-name() = 'A' and (. = 4 or . = 5)]
]/*[
  ローカル名() = 'B'
]/文章()

しかし実際には、名前空間を認識する XPath を使用する必要があります。

//ns1:element[ns2:A[. = 4 or . = 3]]/ns2:B/text()
于 2012-11-19T23:07:38.437 に答える