2015-05-14 100 views
1

当我尝试使用以下样式表转换XMl时,转换失败,出现错误Expected QName。什么是缺少在styelesheet,粘贴在下面?XSL转换失败:预期QName

<?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:从提供的答案将建议后,样式表工作正常,更新的样式表如下

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

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

+0

我已经将您的建议应用于我的样式表,现在看起来工作正常。我用修改过的样式表更新了这个问题 – user2607367