2010-03-15 37 views
1

使用XSL:如何組合或合併分組節點?

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> 
    <xsl:output method="xml"/> 
    <xsl:template match="/"> 
     <records> 
      <record> 
       <!-- Group record by bigID, for further processing --> 
       <xsl:for-each-group select="records/record" group-by="bigID"> 
        <xsl:sort select="bigID"/> 
        <xsl:for-each select="current-group()"> 
         <!-- Create new combined record --> 
         <bigID> 
          <!-- <xsl:value-of select="."/> --> 
          <xsl:for-each select="."> 
           <xsl:value-of select="bigID"/> 
          </xsl:for-each> 
         </bigID> 
         <text> 
          <xsl:value-of select="text"/> 
         </text> 
        </xsl:for-each> 
       </xsl:for-each-group> 
      </record> 
     </records> 
    </xsl:template> 
</xsl:stylesheet> 

我試圖改變:

<?xml version="1.0" encoding="UTF-8"?> 
<records> 
    <record> 
     <bigID>123</bigID> 
     <text>Contains text for 123</text> 
     <bigID>456</bigID> 
     <text>Some 456 text</text> 
     <bigID>123</bigID> 
     <text>More 123 text</text> 
     <bigID>123</bigID> 
     <text>Yet more 123 text</text> 
    </record> 
</records> 

到:

<?xml version="1.0" encoding="UTF-8"?> 
<records> 
    <record> 
     <bigID>123 
      <text>Contains text for 123</text> 
      <text>More 123 text</text> 
      <text>Yet more 123 text</text> 
     </bigID> 
     <bigID>456 
      <text>Some 456 text</text> 
     </bigID> 
    </record> 
</records> 

現在,我剛剛上市的分組<bigID> S,個別。我錯過了分組後的步驟,我將分組的<bigID>節點組合在一起。我的懷疑是我需要使用「鍵」功能,但我不確定。

感謝您的任何幫助。

+0

您的輸入和輸出xml格式不正確。這使得輸出格式不明確。 – 2010-03-16 15:42:11

回答

0

這裏是有用XSLT 2.0轉化

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

    <xsl:key name="kTextforId" match="text" 
     use="preceding-sibling::bigID[1]"/> 

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

    <xsl:template match="record"> 
    <record> 
    <xsl:for-each-group select="bigID" group-by="."> 
    <bigID> 
     <xsl:sequence select="current-grouping-key()"/> 

     <xsl:copy-of select= 
     "key('kTextforId', current-grouping-key())"/> 
    </bigID> 
    </xsl:for-each-group> 
    </record> 
    </xsl:template> 
</xsl:stylesheet> 

當所提供的XML文檔進行,有用的結果被產生。

+0

我以爲我在尋找Lachlan Roche的代碼在第二個例子中給出的輸出。然而,最終結果是我需要的輸出是由Dimitre的代碼創建的。非常感謝您的幫助!非常感謝。 – LOlliffe 2010-03-16 19:03:57

-1

在XSLT 2.0中,您不需要按鍵進行分組。

由於您只是複製組中的text元素,因此可以移除內部的for-each元素。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="/"> 
     <records> 
      <record> 
       <xsl:for-each-group select="records/record/bigID" group-by="."> 
        <xsl:sort select="." data-type="number" /> 
        <bigID> 
         <xsl:value-of select="." /> 
         <xsl:copy-of select="current-group()/following-sibling::text[1]" /> 
        </bigID> 
       </xsl:for-each-group> 
      </record> 
     </records> 
    </xsl:template> 

</xsl:stylesheet> 

如果你不是要輸出的bigID元素,然後他們的文本元素,然後我的循環將被替換如下。

<xsl:for-each-group select="records/record/bigID" group-by="."> 
    <xsl:sort select="." data-type="number" /> 
    <xsl:copy-of select="." /> 
    <xsl:copy-of select="current-group()/following-sibling::text[1]" /> 
</xsl:for-each-group>