我有这个xslt样式表:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/REC-html40"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>
<xsl:output method="xml" omit-xml-declaration="yes" standalone="yes" />
<xsl:template match="/" >
<Parameters>
<xsl:apply-templates/>
</Parameters>
</xsl:template>
<xsl:template match="PrimitiveParameter">
<!-- String -->
<xsl:if test="Value/@xsi:type='xsd:string'">
<xsl:element name="StringParameter">
<xsl:attribute name="name">
<xsl:value-of select="Name" />
</xsl:attribute>
<xsl:if test="Key">
<xsl:attribute name="DomainKey">
<xsl:value-of select="Key" />
</xsl:attribute>
</xsl:if>
<xsl:value-of select="Value" />
</xsl:element>
</xsl:if>
<!-- DateTime -->
<xsl:if test="Value/@xsi:type='xsd:dateTime'">
<xsl:element name="DateParameter">
<xsl:attribute name="name">
<xsl:value-of select="Name" />
</xsl:attribute>
<xsl:value-of select="Value" />
</xsl:element>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
并生成此XML:
<Parameters xmlns="http://www.w3.org/TR/REC-html40" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<StringParameter name="field" DomainKey="Domaine">TNA</StringParameter>
<DateParameter name="date">2011-12-14T00:00:00</DateParameter>
</Parameters>
我想删除XML Namespace声明:
<Parameters>
<StringParameter name="field" DomainKey="Domaine">TNA</StringParameter>
<DateParameter name="date">2011-12-14T00:00:00</DateParameter>
</Parameters>
有可能吗?
问候,
弗洛里安
答案 0 :(得分:2)
在这种情况下,删除xmlns="..."
应该像删除
xmlns="http://www.w3.org/TR/REC-html40"
来自xsl:stylesheet
开头标记。仅指定xsl:element
(没有name
)的文字结果元素和namespace
指令受制于在样式表XML文档中出现的位置生效的名称空间声明。
要删除其他未使用的命名空间声明,您需要将另一个属性添加到xsl:stylesheet
exclude-result-prefixes="xsd xsi"
另外需要注意的是,对Value/@xsi:type='xsd:string'
之类的内容进行的测试是精确的字符串比较 - 如果源文档使用xsd
以外的前缀
<PrimitiveParameter xmlns:xs="http://www.w3.org/2001/XMLSchema">
<Value xsi:type="xs:string">...</Value>
</PrimitiveParameter>
然后这些将不匹配,即使在语义上XML也在说同样的事情。要正确处理这个问题,您需要使用模式感知的XSLT 2.0处理器(如Saxon EE),并使用element(Value, xsd:string)
之类的测试来测试元素的模式类型,而不是其xsi:type
的文本值。属性。