2008 Sep 29 2:19 PM
When converting exchange rates xml from http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml
I'm getting problem with xmlns in root element.
CALL TRANSFORMATION triggers CX_XSLT_ABAP_CALL_ERROR, but only if there is xmlns attribute in first line in input xml:
<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">
Without this xmlns=..... (or when modifying e.g. abcxmlns= ) works following xslt fine:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sap="http://www.sap.com/sapxsl" version="1.0">
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="Cube/Cube">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<ROOT2>
<xsl:value-of select="@time"/>
</ROOT2>
<ROOT1>
<xsl:apply-templates select="Cube"/>
</ROOT1>
</asx:values>
</asx:abap>
</xsl:template>
<xsl:template match="Cube/Cube/Cube">
<loop>
<AMOUNT>
<xsl:value-of select="1"/>
</AMOUNT>
<CCYCODE>
<xsl:value-of select="@currency"/>
</CCYCODE>
<VALUE>
<xsl:value-of select="@rate"/>
</VALUE>
</loop>
</xsl:template>
</xsl:transform>
I'd appreciate if someone migh advise me how to alternate the xslt or tell me what the xmlns in input does.
Cheers
Edited by: Viktor Kunc on Sep 29, 2008 3:25 PM
If a namespace is specified on root level, it propagates down to all children, see:
http://www.w3.org/TR/REC-xml-names/
The namespace is part of a name. So, if you have an element <Cube> as child of the root element <root xmlns="http://www.gesmes.org/xml/2002-08-01">, then
<xsl:apply-templates select="Cube"/>
won't be applied, since the qualified name of the element is not Cube but {http://www.gesmes.org/xml/2002-08-01}Cube
If you want the XSLT to work with and without namespace equally well, you have to work with local names in XPath expressions:
<xsl:apply-templates select="local-name() = 'Cube'"/>
The same holds for all XPath functions working with element names.
Usually, however, the namespace is part of the contract with the client and is
But not both.
Regards,
Rüdiger
2012 Jul 24 12:53 PM
2012 Jul 24 1:22 PM
If a namespace is specified on root level, it propagates down to all children, see:
http://www.w3.org/TR/REC-xml-names/
The namespace is part of a name. So, if you have an element <Cube> as child of the root element <root xmlns="http://www.gesmes.org/xml/2002-08-01">, then
<xsl:apply-templates select="Cube"/>
won't be applied, since the qualified name of the element is not Cube but {http://www.gesmes.org/xml/2002-08-01}Cube
If you want the XSLT to work with and without namespace equally well, you have to work with local names in XPath expressions:
<xsl:apply-templates select="local-name() = 'Cube'"/>
The same holds for all XPath functions working with element names.
Usually, however, the namespace is part of the contract with the client and is
But not both.
Regards,
Rüdiger
| User | Count |
|---|---|
| 6 | |
| 2 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |