|
Subject: RE: [xsl] using key to merge data From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Mon, 22 Oct 2007 20:57:29 +0100 |
If you want the children of question/info to be copied, then you need to
copy them, just as you are currently copying the attributes. For example you
could do:
> <xsl:template match="question/info">
> <xsl:copy>
> <xsl:copy-of select="@*|*"/> <!-- note change here -->
> <xsl:variable name="question_g_code" select="notes"/>
> <xsl:for-each select="$standardFile">
> <xsl:copy-of select="key('standard_by_g_code',
> $question_g_code)"/>
> </xsl:for-each>
> </xsl:copy>
> </xsl:template>
> </xsl:stylesheet>
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: Terry Ofner [mailto:tofner@xxxxxxxxxxx]
> Sent: 22 October 2007 20:52
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] using key to merge data
>
> Greetings,
>
> I am trying to merge a set of standards into another xml
> file. I have tried using document() pointing to a separate
> file as well as incorporating the standards into the
> stylesheet. With both methods I run into a similar problem.
> The standards information merges fine.
> However, it removes the sibling nodes from tree. Here is the
> basic structure of the xml file I am importing into:
>
> <top>
> <question>
> <info>
> <topic>Vocabulary</topic>
> <keyword>Prefixes</keyword>
> <notes>G4U1S01></notes>
> <foo>blah blah</foo>
> </info>
> </question>
> </top>
>
> The standards.xml file looks like this:
>
> <top>
> <standard>
> <g_code>G4U1S01</g_code>
> <state-obj state="AZ">blah blah blah</state-obj>
> <state-obj state="TX">blah blah blah</state-obj>
> . . .
> </standard>
> </top>
>
>
> When I run the stylesheet below, the <notes> node along with
> all the sibling nodes are removed from the <info> node.
>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
> <xsl:import href="copy.xslt"/>
> <xsl:output method="xml"/>
>
> <xsl:variable name="standardFile"
> select="document('standards.xml')"/>
> <xsl:key name="standard_by_g_code" match="standard" use="g_code"/>
>
> <xsl:template match="/">
> <xsl:copy>
> <xsl:apply-templates/>
> </xsl:copy>
> </xsl:template>
>
> <xsl:template match="question/info">
> <xsl:copy>
> <xsl:copy-of select="@*"/>
> <xsl:variable name="question_g_code" select="notes"/>
> <xsl:for-each select="$standardFile">
> <xsl:copy-of select="key('standard_by_g_code',
> $question_g_code)"/>
> </xsl:for-each>
> </xsl:copy>
> </xsl:template>
> </xsl:stylesheet>
>
>
> The current result looks like this:
>
> <top>
> <question>
> <info>
> <standard>
> <g_code>G4U1S01</g_code>
> <state-obj state="AZ">blah blah blah</state-obj>
> <state-obj state="TX">blah blah blah</state-obj>
> . . .
> </standard>
> </info>
> </question>
> </top>
>
> I am looking for this:
>
> <top>
> <question>
> <info>
> <topic>Vocabulary</topic>
> <keyword>Prefixes</keyword>
> <notes>G4U1S01></notes>
> <foo>blah blah</foo>
> <state-obj state="AZ">blah blah blah</state-obj>
> <state-obj state="TX">blah blah blah</state-obj>
> . . .
> </info>
> </question>
> </top>
>
>
> No doubt there something simple that I am doing wrong.
>
> FYI: the <xsl:import href="copy.xslt"/> points to this stylesheet:
>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
> <xsl:template match="node( ) | @*">
> <xsl:copy>
> <xsl:apply-templates select="@* | node( )"/>
> </xsl:copy>
> </xsl:template>
> </xsl:stylesheet>
>
> Thanks in advance.
>
> Terry
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| [xsl] using key to merge data, Terry Ofner | Thread | RE: [xsl] changing value of xi:incl, Nancy Brandt |
| [xsl] using key to merge data, Terry Ofner | Date | Re: [xsl] Date, Number Format, Waqar Ali |
| Month |