2014-10-02 68 views
0

我不能完全包裹我的大腦 - 我只做XSLT很少。在一個條件我需要複製一個節點。我看過「模板」和「複製」,但不知道如何使它們一起工作。複製節點,如果

的XML我有

<data> 
    <product> 
    <productnumber>655.43</productnumber> 
    <parentproduct></parentproduct> 
    </product> 
    <product> 
    <productnumber>655.38</productnumber> 
    <parentproduct>655.43</parentproduct> 
    </product> 
</data> 

的XML我想

<data> 
    <product> 
    <productnumber>655</productnumber> 
    <parentproduct></parentproduct> 
    </product> 
    <product> 
    <productnumber>655.43</productnumber> 
    <parentproduct>655</parentproduct> 
    </product> 
    <product> 
    <productnumber>655.38</productnumber> 
    <parentproduct>655</parentproduct> 
    </product> 
<data> 

所以,如果parentproduct是空的,產品的節點應被複制。

我與看起來像搞亂

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
<xsl:output cdata-section-elements="column"/> 
<xsl:template match="/data/product"> 
    <xsl:copy> 
     <xsl: apply-templates select="/data/product"/> 
    </xsl:copy> 
</xsl:template> 

所以我需要在應用模板的select語句的一些「東西」的XSL ......但不能弄明白。

在此先感謝您的幫助! 關心/ Snedker

+0

「*所以,如果父產品是空的,產品節點應該被複制。*」這不是你的例子所顯示的 - 請澄清。 – 2014-10-02 11:12:45

+0

655.43表示655是主要產品(ProductID),以及43是變體(VariantID)。按照表格的順序,必須有一行ProductID和VariantID(主)。接下來,所有變體行都有ProductID + VariantID。 我的麻煩是,主人(沒有parentproduct)也充當變體(因此產品中的內容)。 「我想要的XML」顯示主產品+兩種變體。 希望澄清。並感謝您的努力! BR/Morten – 2014-10-03 13:50:02

+0

恐怕我還沒有完全和你在一起。輸入XML顯示655.43是655.38的父代產品。這些信息在轉換中丟失了。你確定這就是你想要的嗎? – 2014-10-03 14:04:56

回答

-2

我建議你最好使用<xsl:copy-of select="."/>,它複製當前節點的確切全深度副本。

+0

我發現的信息表明,複製對於後續的屬性操作不太合適。但我是一個noob,所以我可能是錯的。 Thx爲你輸入! BR – 2014-10-03 13:53:48

0

我有一種感覺,我還是失去了一些東西,但請嘗試以下樣式:

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="product-by-parent" match="productnumber" use="substring-before(., '.')" /> 

<xsl:template match="/"> 
    <data> 
     <!-- for each unique integer part of productnumber --> 
     <xsl:for-each select="data/product/productnumber[count(. | key('product-by-parent', substring-before(., '.'))[1]) = 1]"> 
      <xsl:variable name="parent" select=" substring-before(., '.')" /> 
      <product> 
       <productnumber><xsl:value-of select="$parent"/></productnumber> 
       <parentproduct/> 
      </product> 
      <!-- for each productnumber starting with the current integer --> 
      <xsl:for-each select="key('product-by-parent', $parent)"> 
       <product> 
        <productnumber><xsl:value-of select="."/></productnumber> 
        <parentproduct><xsl:value-of select="$parent"/></parentproduct> 
       </product> 
      </xsl:for-each> 
     </xsl:for-each> 
    </data> 
</xsl:template> 

</xsl:stylesheet> 

恕我直言,你的輸出模式可以通過包裝中的子產品加以改進一個共同的父元素。

相關問題