4

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

2 回答 2

5

这是产生所需结果的完整转换

<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"/>
于 2012-04-19T12:10:51.443 回答
2

首先,在 XSLT/XPath 数据模型中只有xsi:schemaLocation是一个属性。如果您根本不想复制该属性或任何属性,那么请不要这样做,<xsl:copy-of select="@*"/>因为您明确复制了所有属性。或者,如果您想有选择地指定不复制哪些属性而不是<xsl:copy-of select="@*"/>put in <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元素上。

于 2012-04-19T11:16:41.443 回答