2009-06-17 88 views
0

我已經獲得了一個XML文檔,其中使用了許多不同的命名空間,並且有一個模式用於驗證。該模式要求所有元素都是「合格的」,並且我認爲這意味着他們需要具有完整的QNames而沒有空名稱空間。使用默認命名空間選擇節點

但是,這個巨大的XML文檔中的一些元素已經通過使用默認命名空間,在這個文檔的情況下是空白的。自然,他們未通過模式驗證。

我想寫一個XSLT,它將選擇沒有名稱空間的節點,併爲它們指定一個具有與其他名稱相同前綴的特定節點。例如:

<x:doc xmlns:x="http://thisns.com/"> 
    <x:node @x:property="true"> 
    this part passes validation 
    </x:node> 
    <node property="false"> 
    this part does not pass validation 
    </node> 
</x:doc> 

我已經嘗試添加xmlns="http://thisns.com/"到文檔的根節點,但這並不與架構驗證同意。關於如何使這項工作有任何想法?

謝謝!

回答

2
<!-- Identity transform by default --> 
<xsl:template match="node() | @*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node() | @*"/> 
    </xsl:copy> 
</xsl:template> 
<!-- Override identity transform for elements with blank namespace --> 
<xsl:template match="*[namespace-uri() = '']">  
    <xsl:element name="{local-name()}" namespace="http://thisns.com/"> 
    <xsl:apply-templates select="node() | @*"/> 
    </xsl:element> 
</xsl:template> 
<!-- Override identity transform for attributes with blank namespace --> 
<xsl:template match="@*[namespace-uri() = '']"> 
    <xsl:attribute name="{local-name()}" namespace="http://thisns.com/"><xsl:value-of select="."/></xsl:attribute> 
</xsl:template> 

這將使類似的結果:

<x:doc xmlns:x="http://thisns.com/"> 
    <x:node x:property="true"> 
    this part passes validation 
    </x:node> 
    <node xp_0:property="false" xmlns="http://thisns.com/" xmlns:xp_0="http://thisns.com/"> 
    this part does not pass validation 
    </node> 
</x:doc> 

注意,第二<節點>仍然沒有命名空間前綴,但它現在被認爲是因爲XMLNS的相同的命名空間的一部分=屬性。

相關問題