2

次のhtmlが与えられた場合

<p>
    <div class="allpricing">
      <p class="priceadorn">
          <FONT CLASS="adornmentsText">NOW:&nbsp;</FONT>
          <font CLASS="adornmentsText">$1.00</font>
      </p>
    </div>
</p>

なぜ

//div[@class="allpricing"]/p[@class="priceadorn"][last()]/font[@class="adornmentsText"][last()]

$1.00 の期待値を返す

pしかし、要素を追加する

//p/div[@class="allpricing"]/p[@class="priceadorn"][last()]/font[@class="adornmentsText"][last()]

何も返さない?

4

4 に答える 4

3

div内に を配置することはできませんp。開始は自動的にdiv閉じpます。<p> タグ内のブロック レベル要素のネストを参照してください ... 正しいか間違っているか?

于 2012-09-03T16:59:24.453 に答える
0

ケースの修正が原因であることがよくあります。XPath 1.0は大文字と小文字を区別し、混合大文字と小文字を明示的に処理しない限り、多くの場合失敗します。

于 2012-09-03T17:11:01.883 に答える
0

ソースを XML 文書ではなく HTML として記述していますが、それをどのように解析したかを説明していません。HTML パーサーを使用して解析すると、パーサーはそれを「修復」して有効な HTML に変換します。つまり、作成するツリーには、ソースに記述した内容が直接反映されません。XPath は、元のツリーではなく、この「修復された」ツリーを認識します。

于 2012-09-03T21:50:23.047 に答える
0

XPath では大文字と小文字が区別されます。

提供された XPath 式はどれも node を選択しません。これは、提供された XML 文書にはfont名前付きの属性を持つ要素がないためですclass(要素fontにはCLASS属性があり、これはclass大文字と小文字が異なるため、属性を持つこととは異なります)。

同じ理由で、fontFONTは異なる名前の要素です。

これら 2 つの XPath 式は、提供された XML ドキュメントに対して評価されると、同じ目的の結果を生成します。

   //div[@class="allpricing"]
       /p[@class="priceadorn"]
                       [last()]
          /font[@CLASS="adornmentsText"]
                               [last()] 

//p/div[@class="allpricing"]
      /p[@class="priceadorn"]
                        [last()]
         /font[@CLASS="adornmentsText"]
                                   [last()]

XSLT ベースの検証:

<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:copy-of select=
  '//div[@class="allpricing"]
       /p[@class="priceadorn"]
                       [last()]
          /font[@CLASS="adornmentsText"]
                               [last()]'/>
=============
  <xsl:copy-of select=
   '//p/div[@class="allpricing"]
          /p[@class="priceadorn"]
                            [last()]
             /font[@CLASS="adornmentsText"]
                                       [last()]
   '/>
 </xsl:template>
</xsl:stylesheet>

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

<p>
    <div class="allpricing">
      <p class="priceadorn">
          <FONT CLASS="adornmentsText">NOW:&#xA0;</FONT>
          <font CLASS="adornmentsText">$1.00</font>
      </p>
    </div>
</p>

2 つの式が評価され、この評価の結果が出力にコピーされます。

<font CLASS="adornmentsText">$1.00</font>
=============
  <font CLASS="adornmentsText">$1.00</font>
于 2012-09-03T17:31:21.963 に答える