Dot-Net

XSLT 使用預設命名空間轉換 XML 而不添加前綴?

  • August 19, 2011

我正在嘗試使用以下命名空間轉換 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 來實現?

我可以通過向預設命名空間(最後一個)添加前綴來使其工作,但是如何在不添加前綴的情況下輸出 XML,可以通過在 .NET 4 中使用 XslCompiledTransform 來實現?

這是一個具體的例子:

這種轉變

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

引用自:https://stackoverflow.com/questions/3649272