XSL转换失败:预期的QName

时间:2015-05-14 10:43:06

标签: xslt

当我尝试使用下面的样式表转换XMl时,转换失败并显示错误Expected QName。在下面粘贴的styelesheet究竟缺少什么?

 <?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>

更新:应用所提供答案的建议后,样式表工作正常,更新的样式表如下

 <?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>

1 个答案:

答案 0 :(得分:1)

我还没有尝试过,但我认为这可能是因为你在node()上匹配(即元素,文本节点,处理指令注释),但后来尝试创建一个名为可能是非元素节点。 QName是指一个有效的XML名称,我假设一个文本节点,例如,没有一个(当你调用local-name()时)。您可以将模板匹配更改为*,并为其他类型添加另一个模板。