2013-07-19 57 views
0

我想複製元素中的名稱空間。名稱空間屬性及其值可能會有所不同,並可能出現在任何元素中。但我想按照原樣複製名稱空間。此外,我不應該包含任何屬性作爲額外的複製命名空間。我正在使用Saxon 9(he)XSLT處理器進行轉換 在下面的XML文件中,我得到<ct-ext:case>的元素,缺少"xmlns:ct-ext"屬性。我試過copy-namespaces="yes",但我沒有得到正確的輸出。我正在爲各種DTD編寫一個通用的XSLT。使用XSLT複製名稱空間的元素

示例XML:

<?xml version="1.0" encoding="UTF-8"?> 
<ct:doc identifier="GPPCIA702661235" xsi:schemaLocation="http://test.com/test test.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ct="http://test.com/test" xmlns="http://www.w3.org/1998/Math/MathML" xmlns:ct-ext="http://test.com/test-ext"> 
<ct:doc-meta identifier="EHIXRW383636159"> 
<ct:para><ct:inline-math identifier="RCSNDD453018159"><math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mrow><mi>&#x0024;</mi><mn>1.65</mn></mrow></math></ct:inline-math></ct:para> 
<ct-ext:case identifier="CDVOXU875594216" xmlns:ct-ext="http://test.com/test-ext"> 
<ct:simple-meta identifier="HNKRFT326435269"> 
<ct:title identifier="CGSVLX990515344">This is title</ct:title> 
</ct:simple-meta> 
</ct-ext:case> 
</ct:doc-meta> 
</ct:doc> 

輸出所需:

<?xml version="1.0" encoding="UTF-8"?> 
<ct:doc identifier="GPPCIA702661235" xsi:schemaLocation="http://test.com/test test.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ct="http://test.com/test" xmlns="http://www.w3.org/1998/Math/MathML" xmlns:ct-ext="http://test.com/test-ext"> 
<ct:doc-meta identifier="EHIXRW383636159"> 
<ct:para><ct:inline-math identifier="RCSNDD453018159"><math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mrow><mi>&#x0024;</mi><mn>1.65</mn></mrow></math></ct:inline-math></ct:para> 
<ct-ext:case identifier="CDVOXU875594216" xmlns:ct-ext="http://test.com/test-ext"> 
<ct:simple-meta identifier="HNKRFT326435269"> 
<ct:title identifier="CGSVLX990515344">This is title</ct:title> 
</ct:simple-meta> 
</ct-ext:case> 
</ct:doc-meta> 
</ct:doc> 

XSLT嘗試:

<?xml version='1.0'?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ct="http://test.com/test" xmlns="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:ct-ext="http://test.com/test-ext"> 
<xsl:output method="xml" encoding="UTF-8" indent="no"/> 
<xsl:template match="@*|node()"> 
<xsl:copy copy-namespaces="yes"> 
<xsl:apply-templates select="@*|node()"/> 
</xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

回答

1

無論您使用copy-namespaces與否並不重要(是的defa如果輸入XML在內部元素節點上有一個重複的名稱空間聲明,那麼XSLT處理器運行的數據模型與內部名稱空間聲明不存在時產生的數據模型沒有區別。 所以

<root xmlns:ct-ext="http://test.com/test-ext"> 
    <ct-ext:case xmlns:ct-ext="http://test.com/test-ext">...</ct-ext:case> 
</root> 

不會

<root xmlns:ct-ext="http://test.com/test-ext"> 
    <ct-ext:case>...</ct-ext:case> 
</root> 

序列化複製的結果樹最初複製命名空間聲明遺失。因此,當不同。我認爲XSLT沒有辦法阻止這種情況發生。

+0

感謝您的回覆。 – siva2012

1

要詳細說明Martin所說的話:您正在對XML工具(如XSLT)提出要求,而這些要求並不是爲了滿足要求。

如果我們使用更精確的術語,這將有所幫助。你要求複製的不是命名空間,而是namespace declarations

XML工具旨在能夠在您指定它們所在的名稱空間中生成指定的XML元素(和其他節點)。這是XML信息模型的一部分。 XML工具需要讓你指定前綴使用什麼名稱空間,或者把命名空間聲明,只要輸出XML具有正確的元素,並在正確的命名空間屬性。

因此,對於任何下游XML使用者,您指定的要求不應該是必需的。也許如果你解釋爲什麼你希望名稱空間聲明以某種方式出現,我們可以幫助你找到實現這些目的的方法,這些方法與XML命名空間的設計工作方式相兼容。

相關問題