2010-07-27 69 views
1

我想下面的XML文件輸出增加 「的xmlns」 屬性的XML文件:我想使用XSLT

<?xml version="1.0" encoding="ISO-8859-1" ?> 
- <T0020 xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.safersys.org/namespaces/T0020V1"> 
- <INTERFACE> 
    <NAME>SAFER</NAME> 
    <VERSION>04.02</VERSION> 
    </INTERFACE> 

對於我有以下XSLT文件:

<xsl:template match="T0020" > 
    <xsl:copy> 
    <xsl:attribute name="xsi:schemaLocation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd </xsl:attribute> 

    //some code here...............// 

<xsl:copy> 

所以我在<T0020>標籤下添加xmlns =「http://www.safersys.org/namespaces/T0020V1」屬性

+0

好問題(+1)。看到我的答案是一個簡短而簡單的解決方案。 :) – 2010-07-27 13:39:11

回答

1

該樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="*"> 
     <xsl:element name="{name()}" namespace="http://www.safersys.org/namespaces/T0020V1"> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:element> 
    </xsl:template> 
    <xsl:template match="T0020"> 
     <xsl:element name="{name()}" namespace="http://www.safersys.org/namespaces/T0020V1"> 
      <xsl:attribute name="xsi:schemaLocation">http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd</xsl:attribute> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

利用該輸入:

<T0020> 
    <INTERFACE> 
     <NAME>SAFER</NAME> 
     <VERSION>04.02</VERSION> 
    </INTERFACE> 
</T0020> 

輸出:

<T0020 xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.safersys.org/namespaces/T0020V1"> 
    <INTERFACE> 
     <NAME>SAFER</NAME> 
     <VERSION>04.02</VERSION> 
    </INTERFACE> 
</T0020> 

:命名空間節點不是屬性節點。如果你想讓沒有命名空間的元素在某個命名空間下得到輸出,你需要xsl:element/@namespace

+0

+1爲一個非常好的解決方案,只是解決了沒有離題的問題。 – 2013-02-08 17:12:07

2

這種轉變

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:variable name="vDefaultNS" 
    select="'http://www.safersys.org/namespaces/T0020V1'"/> 

<xsl:template match="*"> 
    <xsl:element name="{name()}" namespace="{$vDefaultNS}"> 
    <xsl:copy-of select="namespace::* | @*"/> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

當這個XML文檔施加:

<T0020 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd" 
> 
<INTERFACE> 
    <NAME>SAFER</NAME> 
    <VERSION>04.02</VERSION> 
</INTERFACE> 
</T0020> 

產生通緝的結果

<T0020 xmlns="http://www.safersys.org/namespaces/T0020V1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd"> 
    <INTERFACE> 
     <NAME>SAFER</NAME> 
     <VERSION>04.02</VERSION> 
    </INTERFACE> 
</T0020> 

請注意xmlns不是一個屬性,但表示一個名稱空間聲明。

+0

+1簡短解決方案。但它看起來像提供的樣式表片段正在添加一個模式實例聲明,因爲可能在沒有模式之前。這也可能是更改元素名稱空間的原因。 – 2010-07-27 18:57:25

+0

@Alejandro:我不想在這裏猜測。問題是「如何添加xmlns」...所以我只是顯示這個。 – 2010-07-27 22:19:52