2016-11-23 62 views
2
組合

我有以下HTML結構:選擇每個節點和兄弟姐妹(直到該節點的下一個出現)使用XPath

<document> 
<ol>a question</ol> 
<div>answer</div> 
<div>answer</div> 
<ol>another question</ol> 
<div>answer</div> 
<ol>question #3</ol> 
... 
</document> 

我想採取<ol>節點和下面<div>節點,直到下一個<ol>節點,所以我可以將它們像

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

一個XML到目前爲止,我有以下

<xsl:for-each select="//body/ol"> 
    <document> 

    <content name="question"> 
     <xsl:value-of select="." /> 
    </content> 

    <content name="answer"> 
     <xsl:for-each 
     select="./following-sibling::div !!! need code here !!!> 
     <xsl:value-of select="." /> 
     </xsl:for-each> 
    </content> 
    </document> 
</xsl:for-each> 

我得到的問題很好,但我有麻煩的答案。我曾試着跟隨,前面,而不是,爲每個組,...。有很多類似的問題,但不是以這種格式退出,因爲我的html文件中沒有真正的子結構。

+0

您的處理器是否支持XSLT 2.0? –

+0

不,我使用的Watson Explorer只支持1.0,我想。 – 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-each處理的ol。它是否正確?我認爲'generate-id(preceding-sibling :: ol [1])'也可以寫成'generate-id(preceding-sibling :: ol)'。 – Markus

+0

@Markus鍵被定義爲每個'div'都有緊接在前面的'ol'的id(否,你不能刪除'[1]'謂詞)作爲它的鍵值。這允許每個「ol」通過它的id檢索相應的「div」。 –

+0

因此,如果我將節點集設置爲'generate-id()'節點集的第一個節點(用於生成ID,如果我理解正確的話)總是按文檔順序選擇,而不依賴於軸用過的? – Markus

相關問題