1

この質問は、 XPathがXの子を持つノードのみを返すことができるかという続きです。。

fooを持つすべての「ペット」を見つけたいのですが、一部のペットには名前空間があり、他のペットにはありません。

XPathを使用して、特定の子要素を持つノードのみを選択することは可能ですか?たとえば、このXMLから、「bar」の子を持つペットの要素のみが必要です。したがって、結果のデータセットにはトカゲとブタの要素が含まれます。

<pets xmlns="urn:cat-org:v1">
  <cat>
    <foo>don't care about this</foo>
  </cat>
  <dog xmlns:v1="urn:cat-org:v1">
     <v1:foo>not this one either</foo>
  </dog>
  <lizard>
     <bar>lizard should be returned, because it has a child of bar</bar>
  </lizard>
  <pig xmlns:v55="urn:cat-org:v1">
     <v55:bar>return pig, too</bar>
  </pig>
</pets>

どんなアドバイスも揺るがすでしょう。

4

1 に答える 1

3

たとえば、このXMLから、「bar」の子を持つペットの要素のみが必要です。

使用

/*/*[*[local-name() = 'bar']]

これにより、ローカル名を持つ子が少なくとも1つある最上位要素のすべての子が選択されます"bar"(プレフィックスが存在する場合は関係ありません)。

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="/*/*[*[local-name() = 'bar']]"/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合(整形式になるように修正されます):

<pets xmlns="urn:cat-org:v1">
  <cat>
    <foo>don't care about this</foo>
  </cat>
  <dog xmlns:v1="urn:cat-org:v1">
     <v1:foo>not this one either</v1:foo>
  </dog>
  <lizard>
     <bar>lizard should be returned, because it has a child of bar</bar>
  </lizard>
  <pig xmlns:v55="urn:cat-org:v1">
     <v55:bar>return pig, too</v55:bar>
  </pig>
</pets>

XPath式が評価され、選択した要素が出力にコピーされます

<lizard xmlns="urn:cat-org:v1">
   <bar>lizard should be returned, because it has a child of bar</bar>
</lizard>
<pig xmlns="urn:cat-org:v1" xmlns:v55="urn:cat-org:v1">
   <v55:bar>return pig, too</v55:bar>
</pig>
于 2012-06-13T02:04:17.877 に答える