我正在进行XML转换,并在添加命名空间时遇到有线问题。下面是我的XML和XSL。问题是我转换的XML附加命名空间属性(xmlns ="")来阐述我不想要的。感谢您的帮助
输入XML
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Catalog>
<Books>
<book1>Wise Otherwise</book1>
<book2>Great Expectations</book2>
</Books>
<library>
<Name> Forsyth </Name>
<city> Cumming </city>
</library>
</Catalog>
预期结果
<?xml version="1.0" encoding="UTF-8"?>
<Import xmlns="http://example.com" ImportType="BASE">
<Books>
<book1>Wise Otherwise</book1>
<book2>Great Expectations</book2>
</Books>
<elab>
<Name> Forsyth </Name>
<city> Cumming </city>
</elab>
</Import>
以下是我的XSL
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="library">
<elab>
<xsl:apply-templates />
</elab>
</xsl:template>
<xsl:template match="Catalog">
<Import xmlns="http://example.com" ImportType="BASE">
<xsl:apply-templates />
</Import>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
这是因为您的模板匹配library
会在无命名空间中创建elab
元素,因此序列化程序必须添加xmlns=""
以准确地序列化生成的树。如果您将xmlns="http://example.com"
移到xsl:stylesheet
元素,那么样式表中的所有无前缀文字结果元素都将位于此命名空间中,您将获得结果你需要:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://example.com" >
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="library">
<elab>
<xsl:apply-templates />
</elab>
</xsl:template>
<xsl:template match="Catalog">
<Import ImportType="BASE">
<xsl:apply-templates />
</Import>
</xsl:template>
</xsl:stylesheet>
这里更普遍的一点是,当您使用XSLT(或任何名称空间感知的XML工具)时,不要考虑xmlns
&#34;属性&#34; < sup> 1 而是考虑在正确的命名空间中创建元素以开始,命名空间绑定将自行处理。
1:我称之为&#34;属性&#34;在引号中,因为就XML数据模型而言,它们实际上并不属于属性,您无法像对待它们一样操纵它们