3

特定の要素 (b) の兄弟に続いているが、別の b 要素の前にある要素 (a) を XPath 1.0 (または Regex を使用している可能性があります) で選択しようとしています。

<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>

それを達成する方法はありますか?ありがとうございました!

4

2 に答える 2

5

この 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())
]
于 2010-02-17T13:43:37.363 に答える
1

これは、単一の XPath 式であるソリューションです。

2 つのノードセット と の交点にケイシアンの式を使用:$ns1$ns2

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

現在のノードに続く兄弟$ns1のノードセットで単純に置き換え、次のノードの前にある兄弟のノードセットで置き換えます。<a><b>$ns2<a><b>

これを使用した完全な変換は次のとおりです。

<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>
于 2010-02-20T00:10:25.323 に答える