Subject: RE: xsl:copy, mode and source code
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Fri, 27 Aug 2004 19:11:54 +0100
|
Are you using xsl:output method="text"? If you are, you will have to
generate any XML tags you want in the output "by hand".
Michael Kay
> -----Original Message-----
> From: Dave Jarvis [mailto:djarvis@xxxxxxxxxxxxxxxx]
> Sent: 27 August 2004 18:06
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: xsl:copy, mode and source code
>
> Hello,
>
> I must simplify Java/C source code into a high-level XML
> representation
> (which is transformed into source code). I've hit a snag and would
> really appreciate some help.
>
> Consider the following XML, within the "axe" namespace:
>
> <axe:message type="response">
> <pingResult><axe:value-of select="pingOutput" /></pingResult>
> </axe:message>
>
> The "axe:message" content can contain XML code or text:
>
> <axe:message type="response">
> <nesting level="1">
> <pingResult><axe:value-of select="pingOutput" /></pingResult>
> </nesting>
> </axe:message>
>
> The relevant XSL templates include:
>
> <xsl:template match="axe:message[@type='response']">
> AGENT_m.append( <xsl:apply-templates mode="response" /> );
> </xsl:template>
>
> <xsl:template match="@*|node()" mode="response">
> X<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
> </xsl:template>
>
> <xsl:template match="*" mode="response">
> Y<xsl:apply-templates />
> </xsl:template>
>
> <!-- Used by "axe:var", but may be applicable here ... -->
> <xsl:template match="*|text()">
> "<xsl:copy-of select="." />"
> <xsl:if test="position() != last()">+</xsl:if>
> </xsl:template>
>
> The result from debugging the template:
>
> AGENT_m.append(
> X
> X
> Y
> AGENT_pingOutput );
>
> The desired result:
>
> AGENT_m.append(
> "<pingResult>" +
> AGENT_pingOutput +
> "</pingResult>" );
>
> I could try an ugly hack:
>
> <xsl:template match="@*|node()">
> "<<xsl:value-of select="name()" />>"+
> <xsl:apply-templates /> +
> "</<xsl:value-of select="name()" />>"
> </xsl:template>
>
> I've also tried xsl:copy-of (for a deep copy), and
> xsl:for-each over all
> elements, but no matter what I do, I just can't seem to make
> <pingResult> appear (much less in quotes with concatentation). I've
> read numerous FAQs, a few mailing lists, and searched Google.
> After two
> days of wrestling, I'm stumped; everything I've read leads me
> to believe
> that <pingResult> should appear -- but it doesn't!
>
> Is there an elegant solution?
>
> Many thanks for any ideas, or smacks along the upside of my head.
>
> Sincerely,
> Dave Jarvis
>
> P.S.
> I'm using libxslt from http://xmlsoft.org/XSLT/.
|