XSLT删除一些属性

时间:2012-04-19 10:50:00

标签: xml xslt

我有以下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>

2 个答案:

答案 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