2016-02-28 66 views
0

任何想法如何使用XSLT實現desidered輸出?XSLT:根據給定列表組合節點

源XML:

<results> 
    <pageFunctionResult> 
     <id>46555</id> 
     <name>URC 90 S</name> 
     <quantity>5+</quantity> 
    </pageFunctionResult> 
    <pageFunctionResult> 
     <id>46556</id> 
     <name>URC 90 M</name> 
     <quantity>5+</quantity> 
    </pageFunctionResult> 
    <pageFunctionResult> 
     <id>46557</id> 
     <name>URC 90 L</name> 
     <quantity>10+</quantity> 
    </pageFunctionResult> 
    <pageFunctionResult> 
     <id>96555</id> 
     <name>NICE</name> 
     <quantity>5+</quantity> 
    </pageFunctionResult> 
    <pageFunctionResult> 
     <id>26555</id> 
     <name>NEW L</name> 
     <quantity>5+</quantity> 
    </pageFunctionResult> 
    <pageFunctionResult> 
     <id>26552</id> 
     <name>NEW XXL</name> 
     <quantity>5+</quantity> 
    </pageFunctionResult> 
</results> 

我需要以某種方式結合基於這些元件,其在給定的列表(也可以是xsl:variable),例如: "URC 90", "NEW"

讓我告訴你一個例子輸出應該如何看待:

<results> 
    <pageFunctionResult> 
     <name>URC 90</name> 
     <variantname>URC 90 S</variantname> 
     <id>46555</id> 
     <quantity>5+</quantity> 
     <variant id="1"> 
     <id>46556</id> 
     <name>URC 90 M</name> 
     <quantity>5+</quantity> 
     </variant> 
     <variant id="2"> 
     <id>46557</id> 
     <name>URC 90 L</name> 
     <quantity>10+</quantity> 
     </variant> 
    </pageFunctionResult> 
    <pageFunctionResult> 
     <id>96555</id> 
     <name>NICE</name> 
     <quantity>5+</quantity> 
    </pageFunctionResult> 
    <pageFunctionResult> 
     <name>NEW</name> 
     <variantname>NEW L</variantname> 
     <id>46555</id> 
     <quantity>5+</quantity> 
     <variant id="1"> 
     <id>26552</id> 
     <name>NEW XXL</name> 
     <quantity>5+</quantity> 
     </variant> 
    </pageFunctionResult> 
</results> 

在源XML我們這不是在給定的列表項:NICE。這些節點應該照原樣複製(不需要修改)。

你認爲傢伙,如果我們知道<name>元素的一部分,就有可能實現這個輸出?

+0

你使用XSLT 2.0嗎? –

+0

是的,XSLT版本並不重要。我使用SAXON處理器。 – Adrian

回答

1

這裏是一個XSLT 2.0的樣品,其達到你想要的分組:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:mf="http://example.com/mf" 
    exclude-result-prefixes="xs mf"> 

    <xsl:param name="values" select="'NEW', 'URC 90'"/> 

    <xsl:output indent="yes"/> 

    <xsl:function name="mf:match" as="xs:string"> 
     <xsl:param name="input" as="xs:string"/> 
     <xsl:param name="values" as="xs:string*"/> 
     <xsl:sequence 
      select="if ($values[matches($input, concat('^', .))]) 
        then $values[matches($input, concat('^', .))] 
        else $input"/> 
    </xsl:function> 

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

    <xsl:template match="results"> 
     <xsl:copy> 
      <xsl:for-each-group select="pageFunctionResult" group-by="mf:match(name, $values)"> 
       <xsl:choose> 
        <xsl:when test="name ne current-grouping-key()"> 
          <xsl:copy> 
           <name> 
            <xsl:value-of select="current-grouping-key()"/> 
           </name> 
           <variantname> 
            <xsl:value-of select="name"/> 
           </variantname> 
           <xsl:copy-of select="id, quantity"/> 
           <xsl:apply-templates select="current-group() except ."/> 
          </xsl:copy> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:copy-of select="current-group()"/> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:for-each-group> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="pageFunctionResult"> 
     <variant id="{position()}"> 
      <xsl:apply-templates/> 
     </variant> 
    </xsl:template> 

</xsl:transform> 

在線http://xsltransform.net/6r5Gh3R/1

+0

這是superbbb!還有一個問題:我們可以在pageFunctionResult(但不是變體)之後添加''' MAINPRODUCT'''?我想標記根元素。 – Adrian

+0

我想我想通了。歡迎審查:http://xsltransform.net/6r5Gh3R/4 – Adrian

+0

我想你已經添加了一種方法來添加'position'元素,而不是'for-each select =「current-group()」'你已經使用過,你也可以使用'apply-templates select =「current-group()''使用推式處理,在這種情況下,使用單獨的'mode',如http://xsltransform.net/6r5Gh3R/5 。 –