2017-06-09 113 views
0

我想是這樣創造的xml:XSLT在具有相同的名稱空間聲明根元素內標籤缺失的命名空間

<rns:RootElement xmlns:rns="urn:root-element" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:root-element root-element.xsd"> 
    <rns:DocumentWrapper> 
     <ins:InnerDoc xmlns:ins="urn:inner-doc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:inner-doc inner-doc.xsd"> 
      <ins:Value>Some text</ins:Value> 
     </ins:InnerDoc> 
    </rns:DocumentWrapper> 
</rns:RootElement> 

有了這個模板:

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/"> 

    <rns:RootElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:rns="urn:root-element" 
        xsi:schemaLocation="urn:root-element root-element.xsd"> 
     <rns:DocumentWrapper> 
      <ins:InnerDoc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xmlns:ins="urn:inner-doc" 
          xsi:schemaLocation="urn:inner-doc inner-doc.xsd"> 
       <ins:Value><xsl:value-of select="//*[local-name()='SomeNode']"/></ins:Value> 
      </ins:InnerDoc> 
     </rns:DocumentWrapper> 
    </rns:RootElement> 

</xsl:template> 

但是,相反的結果我想要這個模板給了我一點點不同的結果:

<rns:RootElement xmlns:rns="urn:root-element" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:root-element root-element.xsd"> 
    <rns:DocumentWrapper> 
     <ins:InnerDoc xmlns:ins="urn:inner-doc" xsi:schemaLocation="urn:inner-doc inner-doc.xsd"> 
      <ins:Value>Some text</ins:Value> 
     </ins:InnerDoc> 
    </rns:DocumentWrapper> 
</rns:RootElement> 

正如你所看到的,在轉換結果中,InnerDoc元素缺少xmlns:xsi =「http://www.w3.org/2001/XMLSchema-instance」命名空間的定義,有什麼辦法可以防止丟失這個命名空間嗎?

+1

要稍微擴展Martin Honnen的回答,我想指出缺少重複的'ins'命名空間聲明**不會執行任何操作**。任何一致的XML處理器都會認識到,根元素上的'ins'名稱空間聲明也適用於'ins:InnerDoc'元素。任何將此'ins:InnerDoc'元素的位置移動到其他位置(根元素上的聲明不適用)的位置的一致XSL處理器也將根據需要添加到名稱空間聲明中。 –

+1

我知道,但這個要求來自其他系統,我真的不知道他們是否會在沒有這個名稱空間的情況下正確收到我的消息。無論如何,謝謝你的評論! –

回答

1

由於命名空間聲明xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"存在於根元素上,因此其位於子元素和後代元素的作用域中,並且不需要爲ins:InnerDoc元素重複。我不知道用XSLT強制輸出重複名稱空間聲明的方法。

一些其他的API有一種方式來壓制他們,像LINQ與OmitDuplicateNamespacesSaveOptionshttps://msdn.microsoft.com/en-us/library/system.xml.linq.saveoptions(v=vs.110).aspx XML,但補充說,選項,而序列化的LINQ to XML樹時,不執行他們抑制重複的命名空間聲明。

+0

感謝您的回答!我想是這樣的,似乎我需要以其他方式處理我的問題。 –

相關問題