1

私はXML構造を持っています。XPathを実行するコンテキストは、クラス属性「ac」を持つ要素の1つです。XPathを作成して、属性クラス「ac1」を持つコンテキスト要素のすべての直接の兄弟を見つけるのを手伝ってください。たとえば、実行のコンテキストがクラス属性「ac」の2番目の要素である場合、結果にはクラス属性「ac1」の2つ(3つではない)の即時要素が含まれる必要があります。

ありがとうございました。

<container>
<item class="ac"/>
<item class="ac1"/>
<item class="ac1"/>
<item class="ac1"/>
<item class="ac"/>
<item class="ac1"/>
<item class="ac1"/>
<item class="ac2"/>
<item class="ac1"/>
<item class="ac"/>
<item class="ac1"/>
<item class="ac1"/>
<item class="ac1"/>
</container>
4

1 に答える 1

1

I. XPath 1.0 では、2 つのノードセットの共通部分に Kayessian メソッドを使用します。

$ns1[count(.|$ns2) = count($ns2)]

これにより、2 つのノードセット$ns1との交点が選択されます$ns2

これに置き換えます

$ns1:

/*/*[@class='ac'][1]/following-sibling::*[@class='ac1']

$ns2: _

/*/*[@class='ac'][2]
        /following-sibling::*[not(@class='ac1')][3]
                                  /preceding-sibling::*

結果の XPath 式は次のとおりです。

 /*/*[@class='ac'][4]
         /following-sibling::*[@class='ac1']
           [count(.
                 |
                  /*/*[@class='ac'][5]
                       /following-sibling::*[not(@class='ac1')][6]
                                              /preceding-sibling::*
                  )
           =
            count(/*/*[@class='ac'][7]
                       /following-sibling::*[not(@class='ac1')][8]
                                              /preceding-sibling::*
                  )
         ]

XSLT ベースの検証:

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

 <xsl:variable name="ns1" select=
  "/*/*[@class='ac'][9]/following-sibling::*[@class='ac1']"/>

 <xsl:variable name="ns2" select=
  "/*/*[@class='ac'][10]
        /following-sibling::*[not(@class='ac1')][11]
                                  /preceding-sibling::*"/>

 <xsl:template match="/">
   <xsl:copy-of select=
   "$ns1[count(.|$ns2) = count($ns2)]"/>
=========
   <xsl:copy-of select=
   "/*/*[@class='ac'][12]
         /following-sibling::*[@class='ac1']
           [count(.
                 |
                  /*/*[@class='ac'][13]
                       /following-sibling::*[not(@class='ac1')][14]
                                              /preceding-sibling::*
                  )
           =
            count(/*/*[@class='ac'][15]
                       /following-sibling::*[not(@class='ac1')][16]
                                              /preceding-sibling::*
                  )
         ]
   "/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<container>
    <item class="ac"/>
    <item class="ac1"/>
    <item class="ac1"/>
    <item class="ac1"/>
    <item class="ac"/>
    <item class="ac1"/>
    <item class="ac1"/>
    <item class="ac2"/>
    <item class="ac1"/>
    <item class="ac"/>
    <item class="ac1"/>
    <item class="ac1"/>
    <item class="ac1"/>
</container>

2 つの XPath 式 (1 つは変数を使用し、もう 1 つは変数を置換したもの) が評価され、それぞれによって選択されたノードが出力にコピーされます

<item class="ac1"/>
<item class="ac1"/>
=========
   <item class="ac1"/>
<item class="ac1"/>

Ⅱ.XPath 2.0 ソリューション:

intersect同じ 2 つのノード セットで標準の XPath 2.0 演算子を使用するだけです。

または、標準の演算子<<andを使用することもできます>>

于 2012-06-23T15:58:44.797 に答える