[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] XSLT merge documents into variable


Subject: Re: [xsl] XSLT merge documents into variable
From: "Mukul Gandhi" <gandhi.mukul@xxxxxxxxx>
Date: Fri, 10 Aug 2007 12:42:53 +0530

Please try the following stylesheet:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                       xmlns:exslt="http://exslt.org/common"
                       exclude-result-prefixes="exslt"
                       version="1.0">

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

  <xsl:variable name="doc" select="/" />

  <xsl:template match="/files">
    <data>
      <xsl:for-each select="document(file[1]/@href)/data/line">
        <line>
          <xsl:copy-of select="@ref" />
          <xsl:variable name="ref" select="@ref" />
          <xsl:attribute name="amount">
            <xsl:variable name="sumOfAmounts">
              <xsl:for-each select="$doc/files/file">
                <num><xsl:value-of
select="document(@href)/data/line[@ref = $ref]/@amount" /></num>
              </xsl:for-each>
            </xsl:variable>
            <xsl:value-of select="sum(exslt:node-set($sumOfAmounts)/num)" />
          </xsl:attribute>
        </line>
      </xsl:for-each>
    </data>
  </xsl:template>

</xsl:stylesheet>

On 8/10/07, Lars Kappert <larskappert@xxxxxxxxx> wrote:
> Bit of a newbie here. I want do some quite simple file processing. I have a basic source file with file references in it. These files should be merged into a variable, which can then be further processed; in my example below the @amount of each line[@ref] is summed. But I'm already stuck in the first part of this, how do I correctly put file1.xml and file2.xml into a variable which then contains (psuedo) "<root><data><lines/></data>><data><lines/></data></root>"? And how can I then use that variable as a basis for further processing?
>
> I'm using XSLT 1.0.
>
> <!-- To XML to process -->
> <?xml version="1.0"?>
> <files>
>        <file href="file1.xml"/>
>        <file href="file2.xml"/>
> </files >
>
> <!-- file1.xml -->
> <data>
>        <line ref="A" amount="2"/>
>        <line ref="B" amount="3"/>
> </data>
>
> <!-- file2.xml -->
> <data>
>        <line ref="A" amount="4"/>
>        <line ref="B" amount="8"/>
> </data>
>
> <!-- result should be -->
> <data>
>        <line ref="A" amount="6"/>
>        <line ref="B" amount="11"/>
> </data>
>
> <!-- XSLT -->
>
> <?xml version="1.0" encoding="utf-8"?>
> <xsl:stylesheet
>        xmlns="http://www.w3.org/1999/xhtml"
>        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>        xmlns:exslt="http://exslt.org/common"
>        version="1.0">
>
>        <xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>
>
>        <xsl:templates match="files">
>                <xsl:variable name="m">
>                        <xsl:apply-templates select="document(file/@href)"/>
>                </xsl:variable>
>                <xsl:apply-templates select="exslt:node-set($m)" mode="merge"/>
>        </xsl:templates>
>
>        <xsl:template match="data" mode="merge">
>                <root>
>                        <xsl:copy-of select="."/>
>                </root>
>        </xsl:template>
>
> </xsl:stylesheet>
>

-- 
Regards,
Mukul Gandhi


Current Thread
Keywords