好吧,我已經看到了這個問題上的許多變化,但沒有一個完全回答我試圖解決的問題,我太密集,不知道如何將其他答案應用於我正在嘗試做的事情。如何消除由一個XML文檔的XSLT轉換生成的xmlns =「」條目到另一個XML文檔
我有一些XML,看起來像下面這樣:
<?xml version="1.0" encoding="utf-8"?>
<message>
<cmd id="api_info">
<api-version>1.0</api-version>
<api-build>1.0.0.0</api-build>
</cmd>
</message>
現在我有一個XSLT轉換是我申請這個XML。該XSLT是類似以下內容:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
version="2.0">
<xsl:output method="xml" version="1.0" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="message"/>
</xsl:template>
<xsl:template match="message">
<xsl:element name="message" xmlns="http://www.companyname.com/schemas/product/Version001">
<xsl:apply-templates select="/message/cmd/@id"/>
</xsl:element>
</xsl:template>
<xsl:template match="/message/cmd/@id">
<xsl:variable name="_commandType" select="/message/cmd/@id"/>
<xsl:element name="messageHeader">
<xsl:element name="cmdType">
<xsl:value-of select="$_commandType"/>
</xsl:element>
</xsl:element>
<xsl:element name="messageBody">
<xsl:choose>
<xsl:when test="$_commandType = 'api_info'">
<xsl:element name="apiInfoBody">
<xsl:element name="apiVersion">
<xsl:value-of select="/message/cmd/api-version"/>
</xsl:element>
<xsl:element name="apiBuild">
<xsl:value-of select="/message/cmd/api-build"/>
</xsl:element>
</xsl:element>
</xsl:when>
<xsl:when test="$_commandType = 'communicationError'">
<xsl:element name="communicationErrorBody">
<xsl:element name="errorCode">
<xsl:value-of select="error-code"/>
</xsl:element>
<xsl:element name="badCmd">
<xsl:value-of select="bad-cmd"/>
</xsl:element>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我得到的輸出基本上是我想要的,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<message xmlns="http://www.companyname.com/schemas/product/Version001">
<messageHeader xmlns="">
<cmdType>api_info</cmdType>
</messageHeader>
<messageBody xmlns="">
<apiInfoBody>
<apiVersion>1.0</apiVersion>
<apiBuild>1.0.0.0</apiBuild>
</apiInfoBody>
</messageBody>
</message>
但我不希望是的xmlns =」 「屬性<messageHeader> and <messageBody> elements。
現在我發現如果我明確指定XSLT中的名稱空間用於這些元素,那麼不需要的屬性會被下拉一個級別給這些屬性的子級。
我只能通過我的整個XSLT和明確屬性添加的xmlns =「」 http://www.companyname.com/schemas/product/Version001「給我的每一個的xsl:元素定義,但我知道必須有一個更優雅的方式,我們的程序員如果我的XSLT不像簡單的例子那樣簡單,我就會想這樣做,但我知道必須有更好的方法。
有誰知道我在這裏失蹤?
謝謝,
AlarmTripper
未更改輸出XML。 – AlarmTripper 2009-12-04 03:41:03
您正在使用哪種XSLT處理器? – 2009-12-04 04:21:07
是的,我確認你的新建議可以正常工作,並且可能是比我更好的解決方案,因爲它會將xmlns分配保留在樣式表元素中。而#default選項使我不必排除每個其他名稱空間前綴。 非常感謝。我對這個XSLT的東西有很多瞭解,我認爲命名空間可能是其中一個棘手的方面。 – AlarmTripper 2009-12-04 04:48:35