2015-05-14 46 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