I have this XML file:
<Response>
<errorCode>error Code</errorCode>
<errorMessage>msg</errorMessage>
<ResponseParameters>
<className>
<attribute1>a</attribute1>
<attribute2>b</attribute2>
</className>
</ResponseParameters>
</Response>
And I want the output to be:
<className>
<attribute1>a</attribute1>
<attribute2>b</attribute2>
</className>
My current XSL file is including also "ResponseParameters" tag, which I do not want.
EDIT: note that the node className is dynamic. I do not know what will be this name at runtime.
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes" />
<xsl:template match="/">
<xsl:copy-of select="//ResponseParameters">
</xsl:copy-of>
</xsl:template>
</xsl:stylesheet>
Use :
<xsl:copy-of select="/Response/ResponseParameters/node()"/>
The "//"
abbreviation is very expensive (causes the complete XML document to be scanned), and should be avoided.
<xsl:copy-of select="Response/ResponseParameters//*"/>
One way is to pass a parameter containing the node name into the XSLT and use the parameter passed in with the name() function to match the dynamic node.
Edit:
But in this simple case either of the other answers suggesting ResponseParameters//* or ResponseParameters/* are a far simpler solution.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With