user2607367
user2607367

Reputation: 225

XSL transformation failed : Expected QName

when I am trying to transform an XMl using below stylesheet, the transformation is failing with error Expected QName. What exactly is missing in the styelesheet, pasted below?

 <?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dp="http://www.datapower.com/extensions" extension-element-prefixes="dp" exclude-result-prefixes="dp">
        <xsl:output method="xml" indent="yes" version="1.0"/>
        <xsl:variable name="origo-svc-augmented" select="'Y'"/>
        <xsl:variable name="origo-svc-ns" select="'http://www.origoservices.com'"/>
        <xsl:template match="node()">
                    <xsl:variable name="namespace" select="namespace-uri(.)"/>
                    <xsl:choose>
                                <!--xsl:when test="$namespace = ''
                  or ($origo-svc-augmented='Y' and $namespace=$origo-svc-ns)"-->
                                <xsl:when test="$origo-svc-augmented = 'N'">
                                            <xsl:element name="{local-name()}">
                                                        <xsl:copy-of select="namespace::*[not(namespace-uri()=$origo-svc-ns)]"/>
                                                        <xsl:apply-templates select="@*|node()|comment()|processing-instruction()|text()"/>
                                            </xsl:element>
                                </xsl:when>
                                <xsl:otherwise>
                                            <xsl:element name="{local-name()}" namespace="{$namespace}">
                                                        <xsl:copy-of select="namespace::*"/>
                                                        <xsl:apply-templates select="@*|node()|comment()|processing-instruction()|text()"/>
                                            </xsl:element>
                                </xsl:otherwise>
                    </xsl:choose>
        </xsl:template>

</xsl:stylesheet>

UPDATE: After applying the suggestion from the answer provided, the stylesheet is working fine, updated stylesheet is as below

 <?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dp="http://www.datapower.com/extensions" extension-element-prefixes="dp" exclude-result-prefixes="dp">
        <xsl:output method="xml" indent="yes" version="1.0"/>
        <xsl:variable name="origo-svc-augmented" select="'Y'"/>
        <xsl:variable name="origo-svc-ns" select="'http://www.origoservices.com'"/>
        <xsl:template match="*">
                    <xsl:variable name="namespace" select="namespace-uri(.)"/>
                    <xsl:choose>
                                <!--xsl:when test="$namespace = ''
                  or ($origo-svc-augmented='Y' and $namespace=$origo-svc-ns)"-->
                                <xsl:when test="$origo-svc-augmented = 'Y'">
                                            <xsl:element name="{local-name()}">
                                                        <xsl:copy-of select="namespace::*[not(namespace-uri()=$origo-svc-ns)]"/>
                                                        <xsl:apply-templates select="@*|node()|comment()|processing-instruction()|text()"/>
                                            </xsl:element>
                                </xsl:when>
                                <xsl:otherwise>
                                            <xsl:element name="{local-name()}" namespace="{$namespace}">
                                                        <xsl:copy-of select="namespace::*"/>
                                                        <xsl:apply-templates select="@*|node()|comment()|processing-instruction()|text()"/>
                                            </xsl:element>
                                </xsl:otherwise>
                    </xsl:choose>
        </xsl:template>
        <xsl:template match="@*|comment()|processing-instruction()|text()">
    <xsl:copy>
    <xsl:apply-templates select="@*|node()|comment()|processing-instruction()|text()"/>
    </xsl:copy>
    </xsl:template>
    </xsl:stylesheet>

Upvotes: 1

Views: 1197

Answers (1)

Giles
Giles

Reputation: 1424

I haven't tried it, but I think it may be because you're matching on node() (i.e. element, text node, processing instruction comment), but then trying to create an element with the name of that possibly non-element node. QName refers to a valid XML name, and I presume a text node, for example, wouldn't have one (when you call local-name()). You could change your template match to be *, and add another template for the other types.

Upvotes: 1

Related Questions