2017-04-25 37 views
0

我是XSLT的新手,我發現這個概念有點難以理解;任何書籍或鏈接的建議?從特定節點中刪除命名空間,將結果用於2nd xslt(version1.0)轉換

我想從customerinfo節點及其所有子節點(即customerinfo,name和age)中刪除名稱空間。命名空間被刪除後,我想使用生成的XML作爲其他xslts的輸入?

XML 1:

<uc:cpy xmlns:uc="http://oldcompany.com"> 
    <customerinfo xmlns="http://oldcompany.com" xmlns:d="http://test" Cid="1004" fid="aa"> 
     <name xmlns="http://oldcompany.com">Matt Foreman</name> 
     <age xmlns="http://oldcompany.com">26</age> 
    </customerinfo> 

    <uc:prodcut xmlns="http://oldcompany.com" xmlns:d="http://test" > 
     <uc:item>Hammer</uc:item> 
     <uc:quantity>1</uc:quantity> 
    </uc:prodcut> 
    </uc:cpy> 

XML 2:除去後的命名空間;將屬性值保留原樣:

<uc:cpy xmlns:uc="http://oldcompany.com"> 
    <customerinfo Cid="1004" fid="aa"> 
     <name>Matt Foreman</name> 
     <age>26</age> 
    </customerinfo> 

    <uc:prodcut xmlns="http://oldcompany.com" xmlns:d="http://test" > 
     <uc:item>Hammer</uc:item> 
     <uc:quantity>1</uc:quantity> 
    </uc:prodcut> 
    </uc:cpy> 

最後,將xml 2作爲輸入傳遞給文檔上的其他xslt模板導入。

回答

0

我想從customerinfo節點及其所有 子節點(即customerinfo,name和age)中刪除命名空間。

如果你事先知道所有的孩子(或後代)的customerinfo節點的名稱,你可以這樣做:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:uc="http://oldcompany.com"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="uc:customerinfo | uc:name | uc:age" > 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

否則做一些更普遍,如:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:uc="http://oldcompany.com"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[ancestor-or-self::uc:customerinfo]" > 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

請注意,這兩種方法都假定屬性是而不是在命名空間中(即,可以被複制)。


最後,傳遞XML 2作爲其他上 文檔XSLT模板的進口輸入。

這是您調用應用程序的任務,而不是您可以在XSLT本身中執行的任務。我不知道爲什麼你需要分兩步開始 - 爲什麼不寫一個樣式表來完成這一切?