2013-10-09 60 views
0

我有這樣的XSLT樣式表:是否可以使用XSLT生成XML文件而不使用xml名稱空間聲明?

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 

<?xml version="1.0" encoding="utf-8" ?> 
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns="http://www.w3.org/TR/REC-html40" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 

> 
    <xsl:output method="xml" omit-xml-declaration="yes" standalone="yes" /> 
    <xsl:template match="/" > 
    <Parameters> 
     <xsl:apply-templates/> 
    </Parameters> 
    </xsl:template> 

    <xsl:template match="PrimitiveParameter"> 

    <!-- String --> 
    <xsl:if test="Value/@xsi:type='xsd:string'"> 
     <xsl:element name="StringParameter"> 
     <xsl:attribute name="name"> 
      <xsl:value-of select="Name" /> 
     </xsl:attribute> 

     <xsl:if test="Key"> 
      <xsl:attribute name="DomainKey"> 
      <xsl:value-of select="Key" /> 
      </xsl:attribute> 
     </xsl:if> 
     <xsl:value-of select="Value" /> 
     </xsl:element> 
    </xsl:if> 

    <!-- DateTime --> 
    <xsl:if test="Value/@xsi:type='xsd:dateTime'"> 
     <xsl:element name="DateParameter"> 
     <xsl:attribute name="name"> 
      <xsl:value-of select="Name" /> 
     </xsl:attribute> 
     <xsl:value-of select="Value" /> 
     </xsl:element> 
    </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

和它產生這個XML:

<Parameters xmlns="http://www.w3.org/TR/REC-html40" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <StringParameter name="field" DomainKey="Domaine">TNA</StringParameter> 
    <DateParameter name="date">2011-12-14T00:00:00</DateParameter> 
</Parameters> 

我想刪除XML命名空間聲明:

<Parameters> 
    <StringParameter name="field" DomainKey="Domaine">TNA</StringParameter> 
    <DateParameter name="date">2011-12-14T00:00:00</DateParameter> 
</Parameters> 

這可能嗎?

問候,

弗洛裏安

回答

2

在這種情況下襬脫xmlns="..."應該是從你的xsl:stylesheet開放標籤卸下

xmlns="http://www.w3.org/TR/REC-html40" 

一樣簡單。文字結果元素和僅指定name(不含namespace)的xsl:element指令受制於它們出現在樣式表XML文檔中的有效命名空間聲明。

爲了擺脫你需要另一個屬性添加到xsl:stylesheet

exclude-result-prefixes="xsd xsi" 

另外一個要注意的其他未使用的命名空間聲明的是,你的東西測試,如Value/@xsi:type='xsd:string'是精確的字符串比較 - 如果源文件使用比xsd

<PrimitiveParameter xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <Value xsi:type="xs:string">...</Value> 
</PrimitiveParameter> 

其他的前綴,那麼這些不匹配,即使塞曼XML在說同樣的事情。爲了正確處理這個問題,您需要使用像Saxon EE這樣的架構感知XSLT 2.0處理器,並使用像element(Value, xsd:string)這樣的測試來測試元素的架構類型,而不是其xsi:type屬性的文本值。

+0

- 我刪除了xmlns =「http://www.w3.org/TR/REC-html40」,但沒有任何效果。 - 我添加了exclude-result-prefixes =「xsd xsi」屬性,它工作正常! 非常感謝! – Florian

相關問題