我正在尝试使用以下命名空间转换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?
答案 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 section的XSLT 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>
上述两个元素是相同的,因为它们具有相同的完全限定名称。