2013-05-15 33 views
1

我有一个XML结构,如:XSL重写直XML结构嵌套的XML

<TOP>top</TOP>
<HDR>header</HDR>
<LINE>line1</LINE>
<LINE>line2</LINE>
<LINE>line3</LINE>
<HDR>header</HDR>
<LINE>line4</LINE>
<LINE>line5</LINE>
<LINE>line6</LINE>

而且我希望有一个XLST脚本将其传送到:

<TOP>top</TOP>
<HDR>
header
<LINE>line1</LINE>
<LINE>line2</LINE>
<LINE>line3</LINE>
</HDR>
<HDR>
header
<LINE>line4</LINE>
<LINE>line5</LINE>
<LINE>line6</LINE>
</HDR>

因此:本<HDR> -tag 周围的行,直到下一个<HDR> -tag

有人可以帮助我,请给我一个xslt脚本。

+0

有一些类似的问题(与答案)例如[Kayessian方法](http://stackoverflow.com/a/3836240/2115381)或http://stackoverflow.com/questions/16188341/create-an-hierarchical-xml-form-an-flat-xml-a-像书,描述 –

回答

1

这种变换:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:key name="kFollowing" match="LINE" 
      use="generate-id(preceding-sibling::HDR[1])"/> 

<xsl:template match="/*"> 
    <xsl:copy-of select="TOP"/> 
    <xsl:apply-templates select="HDR"/> 
</xsl:template> 

<xsl:template match="HDR"> 
    <HDR> 
    <xsl:copy-of select="key('kFollowing', generate-id())"/> 
    </HDR> 
</xsl:template> 
</xsl:stylesheet> 

当在下面的XML文档(所提供的片段,包裹成一个单一的顶部元件)施加:

<t> 
    <TOP>top</TOP> 
    <HDR>header</HDR> 
    <LINE>line1</LINE> 
    <LINE>line2</LINE> 
    <LINE>line3</LINE> 
    <HDR>header</HDR> 
    <LINE>line4</LINE> 
    <LINE>line5</LINE> 
    <LINE>line6</LINE> 
</t> 

产生想要的,正确的结果:

<TOP>top</TOP> 
<HDR> 
    <LINE>line1</LINE> 
    <LINE>line2</LINE> 
    <LINE>line3</LINE> 
</HDR> 
<HDR> 
    <LINE>line4</LINE> 
    <LINE>line5</LINE> 
    <LINE>line6</LINE> 
</HDR>