2016-11-23 63 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

相关问题