元素我有這樣的XML:重命名XSLT
<pos:getPositionRouter xmlns:pos="positionNS">
<positionID>
<code>1</code>
</positionID>
<parameter>?</parameter>
</pos:getPositionRouter>
,我想使用XSLT元素命名pos:getPositionRouter
到x:getPosition
:
<x:getPosition xmlns:x="newPositionNS">
<positionID>
<code>1</code>
</positionID>
<parameter>?</parameter>
</x:getPosition>
這是我想出了sylesheet:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />
<xsl:param name="old_namespace" />
<xsl:param name="old_element_localname" />
<xsl:param name="new_namespace" />
<xsl:param name="new_element_localname" />
<xsl:template match="@*|node()">
<xsl:choose>
<xsl:when test="(local-name() = $old_element_localname) and (namespace-uri() = $old_namespace)">
<xsl:element name="{$new_element_localname}" namespace="{$new_namespace}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:when>
<!-- copy the rest as is -->
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
我不得不使用xalan作爲xslt處理器,輸出結果不幸的是這樣的:
<getPosition xmlns="newPositionNS">
<positionID xmlns:pos="positionNS">
<code>1</code>
</positionID>
<parameter xmlns:pos="positionNS">?</parameter>
</getPosition>
的getPosition
元素的默認命名空間成爲新的命名空間,但子元素應該仍然沒有命名空間(xmlns=""
)。
有人能理解爲什麼嗎?
謝謝!
請注意,您的期望輸出和實際輸出在語義上是平等的:'{} newPositionNS兒童getPosition'正在空命名空間URI,他們只是有一個「positionNS」命名空間URI的範圍(但未使用)。 – 2010-11-18 16:13:57
你好Alejandro,據我所知,兩個輸出在語義上並不相同:根元素上的默認名稱空間設置xmlns =「newPositionNS」被繼承到子元素,所以positionID現在位於newPositionNS名稱空間中,而不是「 「命名空間,因爲它應該。 – Simon 2010-11-18 16:26:59
好問題,+1。看到我的答案是一個簡短而簡單的解決方案。 :) – 2010-11-18 16:54:03