2017-07-24 52 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

相关问题