2014-01-14 129 views
0

Loop-1,2和3元素是無界的。下面是輸入xml,其中所有LOOP-1元素先到達然後是循環2元素。 我們如何能夠將它轉換爲類似輸出xml.I在xslt下面嘗試,但它給出了相同的輸入。XSLT 1.0邏輯拆分元素

輸入XML:

<root> 
<LOOP-1><!-- unbounded --> 
<element1>A</element1> 
</LOOP-1> 
<LOOP-1> 
<element1>A</element1> 
</LOOP-1> 

<LOOP-2><!-- unbounded --> 
<element2>B</element2> 
</LOOP-2> 

<LOOP-2> 
<element2>B</element2> 
</LOOP-2> 

</root> 

XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 

<xsl:template match="/"> 
    <xsl:copy-of select="."/> 
</xsl:template> 

</xsl:stylesheet> 

輸出:

<?xml version="1.0"?> 
<root> 
<LOOP-1> 
<element1>A</element1> 
</LOOP-1> 
<LOOP-2> 
<element2>B</element2> 
</LOOP-2> 
<LOOP-1> 
<element1> A</element1> 
</LOOP-1> 
<LOOP-2> 
<element2>B</element2> 
</LOOP-2> 
</root> 

回答

0

你可以試試下面的代碼:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/root"> 
     <xsl:for-each select="child::LOOP-1"> 
      <xsl:variable name="pos" select="position()"/> 
      <xsl:copy> 
       <xsl:apply-templates/> 
      </xsl:copy> 
      <xsl:apply-templates select="following-sibling::LOOP-2[position()=$pos]"/> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 
0

如果你想應對任何數量的LOOP元素(你在第一句中提到1,2和3,但在你的例子中實際上沒有顯示3),你可以做的是定義一個鍵來幫助你根據他們的「數量」查找元素。

<xsl:key name="loop" match="*[starts-with(local-name(), 'LOOP')]" use="substring-after(local-name(), '-')" /> 

你會然後通過只選擇LOOP-1元素

<xsl:apply-templates select="key('loop', '1')" /> 

下一頁開始,你將有一個共享的模板匹配任何LOOP元素,無論數量

在此您可以調用身份模板來複制元素,後跟一個適用模板選擇在同一位置的LOOP元素與下一個數字,而是一個:

<xsl:apply-templates select="key('loop', string(number(substring-after(local-name(), '-')) + 1))[$pos]" /> 

試試這個XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" /> 

    <xsl:key name="loop" match="*[starts-with(local-name(), 'LOOP')]" use="substring-after(local-name(), '-')" /> 

    <xsl:template match="root"> 
    <root> 
     <xsl:apply-templates select="key('loop', '1')" /> 
    </root> 
    </xsl:template> 

    <xsl:template match="*[starts-with(local-name(), 'LOOP')]"> 
    <xsl:call-template name="identity" /> 
    <xsl:variable name="pos" select="position()" /> 
    <xsl:apply-templates select="key('loop', string(number(substring-after(local-name(), '-')) + 1))[$pos]" /> 
    </xsl:template> 

    <xsl:template match="@*|node()" name="identity"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet>