2017-07-24 81 views
0

達到了病情,我是相當新的XSLT和本我的XML如何獲得父母兄弟的值,直到使用XSLT

<q> 
    <w> 
    <p> 
     <b>b1</b> 
    </p> 
    <p>p1</p> 
    <p>p2</p> 
    <p>p3</p> 
    <p> 
     <b>b2</b> 
    </p> 
    <p> 
     <b>b3</b> 
    </p> 
    <p>p4</p> 
    <p>p5</p> 
    <p> 
     <b>b4</b> 
    </p> 
    <p>p6</p> 
    </w> 
</q> 

我需要我的輸出是這個樣子

<position_1_b1> 
    <p>p1</p> 
    <p>p2</p> 
    <p>p3</p> 
</position_1_b1> 
<position_2_b3> 
    <p>p4</p> 
    <p>p5</p> 
</position_2_b3> 
<position_3_b4> 
    <p>p6</p> 
</position_3_b4> 

有在輸出中沒有b2相關標籤,因爲下一個'P'元素中有一個元素'B'!

<p><b>b2</b></p> 
<p><b>b3</b></p> 

在此先感謝!

+0

分組你可以說你是否能夠使用XSLT 2.0,或者是你限制在XSLT 1.0? –

+0

標題提示了程序算法。該語言是聲明性的,而不是程序性的。 –

+0

是2.0沒關係! –

回答

0

您可以使用XSLT2.0

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="2.0"> 
<xsl:output indent="yes"></xsl:output> 
<xsl:template match="w"> 
    <xsl:for-each-group select="*" group-starting-with="p[b][following-sibling::*[1][self::p][not(b)]]"> 
     <xsl:element name="{concat('position_', position(), '_', normalize-space(.))}"> 
      <xsl:apply-templates select="current-group() except self::p[b]"/> 
     </xsl:element> 
    </xsl:for-each-group> 
</xsl:template> 

<xsl:template match="p[not(b)]"> 
    <p> 
     <xsl:apply-templates/> 
    </p> 
</xsl:template> 

<xsl:template match="p[b]"/> 

+0

謝謝你快速轉身!如果你能建議成爲xpath和xsl的最佳資源,那將是非常好的,因爲我完全不熟悉它。 –

+0

你可以在https://www.w3.org/TR/xslt20/或w3schools上學習,也可以在任何問題上使用stackoverflow幫助你 – Rupesh

+0

@vinaypeta:例如,請參閱[***如何開始與XSLT?***](https://stackoverflow.com/questions/35438518/how-to-get-started-with-xslt) – kjhughes