2011-03-04 15 views
1
<TR> 
<TD>Field 1</TD> 
<TD colSpan=2>Field 2</TD> 
<TD>Field 3</TD> 
</TR> 
<TR> 
<TD>Value for Field1</TD> 
<TD colSpan=2>Value for Field2</TD> 
<TD>Value for Field3</TD> 
<TR></TR> 
</TR> 

どのようにフィールドをその値でマップできますか?私は私のHTMLファイルを解析するためにXPATHを使用しています。XPATHの解析テーブル

そして、主な問題は、あなたがレイアウトは同じになります知っているようにフィールドの数は、それぞれ、すべてのinput..Butの変化である....

+0

あなたのXPath文字列を投稿することができますか? –

+0

良い質問、+1。 2行の 'TD 'の数が異なる場合でも正しいノードを選択する簡単で簡単なXPath式については、私の答えを見てください。 :) –

答えて

1

このXPath式

/*/*[2]/TD 
     [position() 
     = 
     count(/*/*[1] 
        /TD[.=$pName]/preceding-sibling::TD 
      ) +1 
     ] 

は、あなたが上記の式でに置き換えた場合、このように変数pName

に指定された「名前」に対応する「値」とTDを選択'Field 2'を選択すると、次が選択されます。

<TD colSpan="2">Value for Field2</TD> 

:このXPath式は、2つの行の番号が異なるの場合でも、正しいノードを選択します。

TDのテキストの子ノードのみを選択する場合は、/text()を追加します。

を使用し、単なる文字列値を取得するには:

string(/*/*[2]/TD 
      [position() 
      = 
      count(/*/*[1] 
         /TD[.=$pName]/preceding-sibling::TD 
       ) +1 
      ] 
     ) 

ここでは、希望値が取得されることを証明短いXSLT変換である:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:param name="pName" select="'Field 2'"/> 

<xsl:template match="/"> 
    <xsl:value-of select= 
    "/*/*[2]/TD 
      [position() 
      = 
      count(/*/*[1] 
         /TD[.=$pName]/preceding-sibling::TD 
       ) +1 
      ] 
    "/> 
</xsl:template> 
</xsl:stylesheet> 

この変換されたとき提供されたXML文書(整形式に固定されている):

<TABLE> 
    <TR> 
     <TD>Field 1</TD> 
     <TD colSpan="2">Field 2</TD> 
     <TD>Field 3</TD> 
    </TR> 
    <TR> 
     <TD>Value for Field1</TD> 
     <TD colSpan="2">Value for Field2</TD> 
     <TD>Value for Field3</TD> 
     <TR></TR></TR> 
</TABLE> 

希望の結果が生成されます。私たちはあなたが引っかかって、より良いアイデアを持っているので、

Value for Field2 
2

これはフィールド名を選択します:

//table/tr[position() mod 2 = 0]/td/text() 

これはあなたのフィールドの値を選択します:

この入力で
//table/tr[position() mod 2 = 1]/td/text() 
+0

申し訳ありませんが、あなたはエラーがあります。提供されたXML文書でこれらの式を実際に適用しようとすると、ノードが選択されていないことがわかります。正してください。 –

1

<TABLE> 
    <TR> 
     <TD>Field 1</TD> 
     <TD colSpan="2">Field 2</TD> 
     <TD>Field 3</TD> 
    </TR> 
    <TR> 
     <TD>Value for Field1</TD> 
     <TD colSpan="2">Value for Field2</TD> 
     <TD>Value for Field3</TD> 
    </TR> 
</TABLE> 

このXPath式:

/TABLE/TR/TD[.='Field 3']/following::TD[count(../TD)] 

それは、この要素を選択:

<TD>Value for Field3</TD> 

:これは "通常の" テーブルを想定しています。

関連する問題