2011-05-31 93 views
2

我有以下XMLXSL屬性的命名空間

<?xml version="1.0" encoding="UTF-8"?> 
<content> 
    <artwork classification="12" href="1.jpg"/> 
    <artwork classification="10" href="2.jpg"/> 
</content> 

當應用XSL

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xlink="http://www.w3.org/1999/xlink" 
       > 

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

    <xsl:template match="@href"> 
    <xsl:attribute name="xlink:href"> 
     <xsl:value-of select="."/> 
    </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

它產生

<?xml version="1.0" encoding="UTF-8"?> 
<content> 
    <artwork classification="12" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="1.jpg"/> 
    <artwork classification="10" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="2.jpg"/> 
</content> 

,而我需要

<?xml version="1.0" encoding="UTF-8"?> 
<content xmlns:xlink="http://www.w3.org/1999/xlink"> 
    <artwork classification="12" xlink:href="1.jpg"/> 
    <artwork classification="10" xlink:href="2.jpg"/> 
</content> 

我應該如何修改我的xsl以獲得我需要的結果?

我使用xalan XSLT處理器。

+0

正如註釋:*嚴格說*你展示的這兩個XML文檔是等價的。如果「需要」表示「消費者未能正確解析文檔#1並且解析#2就好」,那麼消費者就會被破壞並應該被修復。不過,生產#2絕對是更清潔。 – 2011-05-31 07:53:11

+0

其實這兩個文件是不相同的;如果收件人處理它們的方式不同,它們的設計會非常糟糕,但根據Canonical XML規則它們不是典型的等價物,所以這樣的應用程序實際上並沒有被破壞。 – 2011-05-31 09:38:00

+0

它們可能不是經典等價的,但它們在語義上是等價的。下游應用不應以不同的方式處理它們。 – 2012-07-20 12:22:40

回答

4

您只需要匹配您想要爲其聲明名稱空間的元素。處理器將爲您應用名稱空間。


XSLT 1.0MSXSL 4.0測試(和還測試爲XSLT 2.0撒克遜-HE 9.2.1.1J

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    > 

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

    <xsl:template match="content"> 
     <content> 
      <xsl:apply-templates select="@*|node()"/> 
     </content> 
    </xsl:template> 

    <xsl:template match="@href"> 
     <xsl:attribute name="xlink:href"> 
      <xsl:value-of select="."/> 
     </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 
+0

是的,它的工作原理。非常感謝!!! – 2011-05-31 07:50:29

+0

歡迎您! – 2011-05-31 07:51:13

+6

請注意,其原因是文字結果元素('')獲取樣式表中聲明的所有範圍內名稱空間的副本,而使用'xsl:copy'生成的元素則不具有這些副本。 – 2011-05-31 09:40:40