2015-06-19 64 views
1

鑑於以下XML:變換產生的默認命名空間的xmlns公約= 「...」

<root xmlns="example.com"> 
    <child /> 
</root> 

什麼XSLT(1.0版),可用於生產:

<newRoot xmlns="stackoverflow.com"> 
    <child /> 
</newroot> 

我已經嘗試了排除結果前綴和名稱空間別名的各種組合。 E.g,

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:e="example.com" xmlns:s="stackoverflow.com" exclude-result-prefixes="e"> 

<xsl:namespace-alias stylesheet-prefix="s" result-prefix="#default" /> 

    <xsl:template match="e:root"> 
     <s:newRoot> 
      <xsl:apply-templates /> 
     </s:newRoot> 
    </xsl:template> 

    <xsl:template match="e:child"> 
     <s:child /> 
    </xsl:template> 

</xsl:stylesheet> 

我來最接近的是以下不正確的XML

<newRoot> 
    <child /> 
</newroot> 

編輯:我對過於簡單的樣品道歉。 我正在尋找的解決方案將更改默認命名空間並對我的xml進行轉換。下面是我希望做什麼更復雜的例子:

<Data xmlns="sample.com/public"> 
    <Insured> 
    <Name>Sample Client</Name> 
    <Locations> 
     <Location Number="1"> 
     <Address> 
      <City>New York</City> 
      <State>New York</State> 
      <Street>222 10 Street</Street> 
     </Address> 
     </Location> 
     <Location Number="2"> 
     <Address> 
      <City>New York</City> 
      <State>New York</State> 
      <Street>3538 27 Street</Street> 
     </Address> 
     </Location> 
    </Locations> 
    <Coverages> 
     <LocationSplit> 
     <LocationNumber>1</LocationNumber> 
     <Clause> 
      <Limit>10000000</Limit> 
     </Clause> 
     </LocationSplit> 
    </Coverages> 
    </Insured> 
</Data> 

<projection xmlns="sample.com/projected"> 
    <insured> 
    <name>Sample Client</name> 
    <location address="222 10 Street New York, New York"> 
     <clause> 
     <limit>10000000</limit> 
     </clause> 
    </location> 
    </insured> 
</projection> 

我認爲這將成爲排除對結果的前綴和命名空間別名是票,因爲我可以明確地使用每個命名空間通過在我的樣式表中聲明它們,然後刪除/ public命名空間,同時將/ projection命名空間別名到#default。但是,別名會導致只刪除名稱空間。

回答

1

它很難理解你的問題是真實的,只是一個例子。把你的例子字面上(作爲自己的答案一樣),答案應該是:

XSLT 1.0

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

<xsl:template match="/e:root"> 
    <newRoot> 
     <xsl:apply-templates /> 
    </newRoot> 
</xsl:template> 

<xsl:template match="e:child"> 
    <child/> 
</xsl:template> 

</xsl:stylesheet> 

一個更通用的答案,那會從現有的命名空間移動所有元/ s到新的命名空間爲:

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

<xsl:template match="*"> 
    <xsl:element name="{local-name()}" namespace="stackoverflow.com"> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 
+0

放置在樣式表中根節點的xmlns =「stackoverflow.com」並沒有前綴,宣佈新的節點,是實現我想要的方式。謝謝!我仍然喜歡關於爲什麼使用xsl:namespace-alias將前綴移動到默認命名空間導致命名空間url根本不被打印的解釋。 – eisenpony

+0

我不明白你爲什麼要在這裏使用'xsl:namespace-alias';在任何情況下,如果您使用'result-prefix =「#default」',那麼您還必須定義一個默認名稱空間。否則,「真實」命名空間是無命名空間,並且這個*將會被打印爲「xmlns:s =」「'。 –

+0

這是我誤會的癥結所在。我認爲命名空間別名正在改變前綴而不是命名空間。非常感謝。 – eisenpony

1

如果您只是想從字面上匹配輸入根和逐字輸出的結果文檔,只是這樣做:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
       xmlns:ex="example.com" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       exclude-result-prefixes="ex"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/ex:root"> 
    <newRoot xmlns="stackoverflow.com"> 
     <child/> 
    </newRoot> 
    </xsl:template> 

</xsl:stylesheet> 

這工作,但可能會或可能無法滿足您的日常需求。下面是另一個轉換,你或其他人可能會發現更多有用的......

XSLT改變所有元素的命名空間

下面的XSLT將所有元素的命名空間更改爲stackoverflow.com

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="*"> 
    <xsl:element name="{local-name()}" namespace="stackoverflow.com"> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet>