2016-11-23 7 views
2

との組み合わせは、私は、次のHTML構造を有する(そのノードの次の発生まで)全てのノードと兄弟を選択しますは、XPath

<vce> 
    <topic> 
    <question> ... </question> 
    <answer> ... </answer> 
    </topic> 
    ... 
</vce> 

のようなXML内のノードなので、私ができるグループ彼らは、これまでのところ私は

を以下しています210

質問はうまくいきますが、回答に問題があります。私は、各グループのために、先行してではなく、次のグループと一緒に働くことを試みました...。似たような多くの質問がありますが、私のhtmlファイルには子 - 親構造が本当にないので、この形式でこのように終了しないでください。

+0

プロセッサでXSLT 2.0がサポートされていますか? –

+0

いいえ、1.0しかサポートしていないWatson Explorerを使用しています。 – RudyVerboven

+0

このトピックをチェックしましたか?http://stackoverflow.com/questions/10859703/xpath-select-all-elements-between-two-specific-elements? – Ievgen

答えて

3

はこのようにそれを試してみてください。

XSLT 1.0

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

<xsl:key name="answers" match="div" use="generate-id(preceding-sibling::ol[1])" /> 

<xsl:template match="/document"> 
    <vce> 
     <xsl:for-each select="ol"> 
      <topic> 
       <question> 
        <xsl:value-of select="." /> 
       </question> 
       <xsl:for-each select="key('answers', generate-id())"> 
        <answer> 
         <xsl:value-of select="." /> 
        </answer> 
       </xsl:for-each> 
      </topic> 
     </xsl:for-each> 
    </vce> 
</xsl:template> 

</xsl:stylesheet> 

次のテスト入力に印加さ:

XML

<document> 
    <ol>question A</ol> 
    <div>answer A1</div> 
    <div>answer A2</div> 
    <ol>question B</ol> 
    <div>answer B1</div> 
    <ol>question C</ol> 
    <div>answer C1</div> 
    <div>answer C2</div> 
</document> 

結果ワットを

<?xml version="1.0" encoding="UTF-8"?> 
<vce> 
    <topic> 
     <question>question A</question> 
     <answer>answer A1</answer> 
     <answer>answer A2</answer> 
    </topic> 
    <topic> 
     <question>question B</question> 
     <answer>answer B1</answer> 
    </topic> 
    <topic> 
     <question>question C</question> 
     <answer>answer C1</answer> 
     <answer>answer C2</answer> 
    </topic> 
</vce> 
+0

解決策を理解しようとしています。 'generate-id()'のコンテキストノードは、現在for-outerの外側で処理されている 'ol'です。これは正しいです?また、 'generate-id(先行兄弟:: ol [1])'も 'generate-id(先行兄弟:: ol)'と書くことができると思います。 – Markus

+0

@Markusキーは、各 'div'が直前の' ol'のidを持つように定義されています(いいえ、 '[1]'述語をキー値として削除することはできません)。これにより、各「ol」は、そのidによって対応する「div」を取り出すことができます。 –

+0

ノードを 'generate-id()'に設定した場合、ノードセットの最初のノード(IDを生成するために使用されます)は、ドキュメントの順序で常に選択され、軸に依存しません中古? – Markus