前の兄弟に続くXPath "

html-agility-pack xpath

質問

私は特定の要素(b)の兄弟に従っているが別のb要素に先行するXPath 1.0(またはRegexで可能かもしれない)を持つ要素(a)を選択しようとしています。

<img><b>First</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/first-href">First Href</a> - 19:30<br>
<img><b>Second</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/second-href">Second Href</a> - 19:30<br>
<img>&nbsp;&nbsp;<a href="/third-href">Third Href</a> - 19:30<br>

私はサンプルをできるだけ実世界に近いものにしようとしました。だからこのシナリオでは私が要素にいるとき

<b>First</b>

私は選択する必要があります

<a href="/first-href">First Href</a> 

私がいるとき

<b>Second</b> 

私は選択する必要があります

<a href="/second-href">Second Href</a> 
<a href="/third-href">Third Href</a>

どのようにそれを達成するための任意のアイデア?ありがとうございました!

受け入れられた回答

このXPathを動的に作成する:

following-sibling::a[preceding-sibling::b[1][.='xxxx']]

'xxxx'は現在の<b>テキストに置き換えられます。

これは、すべての要素が実際兄弟であることを前提としています。そうでない場合は、で動作するようにしようとすることができprecedingfollowingの軸、またはあなたはより具体的なXPathのより良い似ている文書構造を記述します。

XSLTでは次のものも使用できます。

following-sibling::a[
  generate-id(preceding-sibling::b[1]) = generate-id(current())
]

人気のある回答

ここには、ただ一つのXPath式である解決策があります

2つのノードセット$ns1$ns2 交差に対してKaysianの式を使用すると、次のようになります。

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

現在の<b>ノードに続く<a>兄弟のノードセットでは$ns1を代入し、次の<b>ノードに先行する<a>兄弟のノードセットで$ns2を代入します。

これを使った完全な変換があります

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

  <xsl:template match="/">
   <xsl:apply-templates select="*/b"/>
  </xsl:template>

  <xsl:template match="b">
    At: <xsl:value-of select="."/>

    <xsl:variable name="vNextB" select="following-sibling::b[1]"/>

    <xsl:variable name="vA-sAfterCurrentB" select="following-sibling::a"/>

    <xsl:variable name="vA-sBeforeNextB" select=
    "$vNextB/preceding-sibling::a
    |
     $vA-sAfterCurrentB[not($vNextB)]
    "/>

    <xsl:copy-of select=
     "$vA-sAfterCurrentB
              [count(.| $vA-sBeforeNextB)
              =
               count($vA-sBeforeNextB)
               ]
    "/>
  </xsl:template>
</xsl:stylesheet>

この変換が次のXML文書に適用されると、

<t>
    <img/>
    <b>First</b>
    <br />&#xA0;&#xA0;
    <img/>&#xA0;&#xA0;
    <a href="/first-href">First Href</a> - 19:30
    <br />
    <img/>
    <b>Second</b>
    <br />
    <img/>&#xA0;&#xA0;
    <a href="/second-href">Second Href</a> - 19:30
    <br />
    <img/>&#xA0;
    <a href="/third-href">Third Href</a> - 19:30
    <br />
</t>

正しい結果が生成されます。

   At: First <a href="/first-href">First Href</a>
    At: Second <a href="/second-href">Second Href</a>
<a href="/third-href">Third Href</a>



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ