XSLT使用默认命名空间转换XML而不添加前缀?

时间:2010-09-06 05:43:06

标签: .net xml xslt

我正在尝试使用以下命名空间转换XML文件,但是无法找到一种方法使其使用默认命名空间而不向输出XML添加前缀。

原始XML文件:

<pExport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://workflow.converga.com.au/compass">  

我可以通过在默认命名空间(最后一个)添加前缀来使其工作,但是如何在不添加前缀的情况下输出XML,可以在.NET 4中使用XslCompiledTransform?

3 个答案:

答案 0 :(得分:4)

  

我可以通过添加一个来实现它   默认命名空间的前缀(   最后一个),但我怎么能输出一个   XML没有添加前缀,它是   可以使用XslCompiledTransform   在.NET 4中?

以下是如何操作的具体示例:

此转化

<xsl:stylesheet version="1.0"
 xmlns="http://workflow.converga.com.au/compass"
 xmlns:c="http://workflow.converga.com.au/compass"
 xmlns:ext="http://exslt.org/common"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 exclude-result-prefixes="c ext xsl">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pnewItem">
  <item name="wine">
   <price>3</price>
   <quantity>5000</quantity>
  </item>
 </xsl:param>

 <xsl:template match="node()|@*" name="identity">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="c:item[last()]">
  <xsl:call-template name="identity"/>
  <xsl:copy-of select="ext:node-set($pnewItem)/*"/>
 </xsl:template>
</xsl:stylesheet>

在以下XML文档中应用XslCompiledTransform时

<pExport xmlns="http://workflow.converga.com.au/compass">
 <Goods>
  <item name="tobacco">
   <price>5</price>
   <quantity>1000</quantity>
  </item>
 </Goods>
</pExport>

生成想要的(添加了新项目的相同XML文档),结果正确

<pExport xmlns="http://workflow.converga.com.au/compass">
  <Goods>
    <item name="tobacco">
      <price>5</price>
      <quantity>1000</quantity>
    </item>
    <item name="wine">
      <price>3</price>
      <quantity>5000</quantity>
    </item>
  </Goods>
</pExport>

答案 1 :(得分:4)

关键是使用exclude-result-prefixes元素上的stylesheet属性。

this sectionXSLT FAQ中有一些很好的解释。

答案 2 :(得分:2)

您只需在XSLT中定义默认命名空间即可。如果您还定义了一个带前缀的项目,那么您可以轻松地从输入XML中选择项目:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://workflow.converga.com.au/compass" xmlns:compass="http://workflow.converga.com.au/compass">
  <xsl:template match="compass:pExport">
    <pExport>...</pExport>
  ...

上面的模板将与您的输入XML元素匹配 - 并且创建的文字元素将位于默认输出命名空间(相同的命名空间)中。

当然你应该知道在XML中前缀是无关紧要的 - 如果它们具有相同的命名空间和本地名称,则两个项是相同的,即使为这一个命名空间定义了两个前缀。

<element xmlns="http://test.com"></element>
<ns01:element xmlns:ns01="http://test.com"></ns01:element>

上述两个元素是相同的,因为它们具有相同的完全限定名称。