我有以下XML,它可以在我的XML文档中以任一形式出现:
<Message xsi:schemaLocation="http://www.location.com StructureFile.xsd" xmlns=http://www.thenamespace.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
或
<Message xmlns="http://www.thenamespace.com">
我需要输出:
<Message xmlns="http://www.theNEWnamespace.com">
我目前有这个模板来处理两个xml可能性的较短版本:
<xsl:template match="*">
<xsl:element name="{name()}" namespace="http://www.theNEWnamespace.com">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
但是,如果它们存在,则不会删除xml的SchemeLocation或xmlns:xsi部分。
我将如何调整上述内容来处理这两种可能性。
干杯,
编辑:XML结构:
<?xml version="1.0" encoding="utf-8"?>
<Message xsi:schemaLocation="http://www.location.com StructureFile.xsd" xmlns="http://www.thenamespace.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Header>
<Info></Info>
</Header>
</Message>
答案 0 :(得分:4)
这是一个产生想要结果的完整转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="http://www.thenamespace.com">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="x:Message">
<xsl:element name="{name()}" namespace="http://www.theNEWnamespace.com">
<xsl:copy-of select="@*[not(name() = 'xsi:SchemaLocation')]"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下XML文档(未提供!):
<t>
<Message
xsi:SchemaLocation="http://www.location.com StructureFile.xsd"
xmlns="http://www.thenamespace.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</t>
产生了想要的正确结果:
<Message xmlns="http://www.theNEWnamespace.com"/>
答案 1 :(得分:2)
首先,在XSLT / XPath数据模型中,只有xsi:schemaLocation
是一个属性。如果您根本不想复制该属性或任何属性,那么请不要执行<xsl:copy-of select="@*"/>
,因为您明确复制了所有属性。或者,如果您想有选择地指定哪些属性不要复制,而不是<xsl:copy-of select="@*"/>
放入<xsl:apply-templates select="@*"/>
,那么请编写一个用于复制属性的模板,然后编写您不想复制的属性的模板,例如
<xsl:template match="@*">
<xsl:copy/>
</xsl:template>
<xsl:template match="@xsi:schemaLocation"/>
对于xmlns:xsi
,这是一个名称空间声明,它在XSLT / XPath数据模型中不是属性。如果您为元素节点所做的只是您显示的模板,那么我不会看到该命名空间应该如何复制到输出中。
如果您在样式表中也定义了名称空间,那么exclude-result-prefixes="xsi"
元素上需要xsl:stylesheet
。