2

http://www.namspace.org/implからXYZImplによって実装される「抽象」ノードを選択するための正しいクエリは何ですか?

<...>
  <Abstract xmlns:q3="http://www.namspace.org/impl"
                xsi:type="q3:XYZImpl">
    <...></...>
  </Abstract>
  <Abstract xmlns:q8="http://www.namspace.org/another"
                xsi:type="q8:XYZImpl">
    <...></...>
  </Abstract>
 </...>

順序と名前空間プレフィックスは私の管理下にありません

ドキュメントに一意の実装のみが含まれている場合、次のクエリは「機能します」:

//Abstract[contains(@xsi:type,'XYZImpl')]

しかし、完全修飾名(名前空間 + 名前)の正しい仕様を探しています... :/

4

2 に答える 2

2

使用:

   /*/Abstract
       [substring-after(@xsi:type, ':') = 'XYZImpl']
          [namespace::*
              [name() = substring-before(../@xsi:type, ':')
              and
               . = 'http://www.namspace.org/impl'
              ]
          ]

Abstractこれにより、属性に含まれる QName 値のプレフィックスでもあるプレフィックス付きの名前空間を持つ XML ドキュメントの最上位要素の子が選択されxsi:typeます。また、属性に含まれる QName 値の「local-name」部分は、xsi:typeまさに string"XYZImpl"です。

XSLT ベースの検証:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xsi="some:xsi">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:copy-of select=
      "/*/Abstract
           [substring-after(@xsi:type, ':') = 'XYZImpl']
              [namespace::*
                  [name() = substring-before(../@xsi:type, ':')
                  and
                   . = 'http://www.namspace.org/impl'
                  ]
              ]
      "/>
 </xsl:template>
</xsl:stylesheet>

この変換が次の XML ドキュメントに適用されると(提供によって生成され、整形式になります):

<t xmlns:xsi="some:xsi">
      <Abstract xmlns:q3="http://www.namspace.org/impl"
                    xsi:type="q3:XYZImpl">
       </Abstract>
      <Abstract xmlns:q8="http://www.namspace.org/another"
                    xsi:type="q8:XYZImpl">
      </Abstract>
</t>

必要な正しい要素が選択され、出力にコピーされます

<Abstract xmlns:q3="http://www.namspace.org/impl" xmlns:xsi="some:xsi" xsi:type="q3:XYZImpl"/>

: XPath 式が正常に評価されるためには、プレフィックス付きの適切な名前空間がxsiXPath 実装に登録されている必要があります。

于 2012-04-10T13:28:06.450 に答える
0

もちろん、xml に関する質問への回答は、有効なサンプルを使用する方が簡単です....

最善の方法ではないかもしれませんが、次の方法でうまくいきます。

//Abstract[namespace::*[.="http://www.namspace.org/impl"] and contains(@xsi:type,":XYZImpl")]
于 2012-04-10T09:43:46.697 に答える