Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net XSLT使用默认名称空间转换XML而不添加前缀?_.net_Xml_Xslt - Fatal编程技术网

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

.net XSLT使用默认名称空间转换XML而不添加前缀?,.net,xml,xslt,.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文件,但在不向输出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是可能的?

您只需要在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>

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

我可以通过添加一个 默认名称空间(默认名称空间)的前缀 最后一个),但如何输出 没有添加前缀的XML,它是 可以使用XslCompiledTransform 在.NET4中

下面是一个具体的例子:

此转换

<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>
<pExport xmlns="http://workflow.converga.com.au/compass">
 <Goods>
  <item name="tobacco">
   <price>5</price>
   <quantity>1000</quantity>
  </item>
 </Goods>
</pExport>
<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>

3.
5000
与XslCompiledTransform一起应用于以下XML文档时

<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>
<pExport xmlns="http://workflow.converga.com.au/compass">
 <Goods>
  <item name="tobacco">
   <price>5</price>
   <quantity>1000</quantity>
  </item>
 </Goods>
</pExport>
<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>

5.
1000
生成所需的(添加了新项的相同XML文档),结果正确

<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>
<pExport xmlns="http://workflow.converga.com.au/compass">
 <Goods>
  <item name="tobacco">
   <price>5</price>
   <quantity>1000</quantity>
  </item>
 </Goods>
</pExport>
<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>

5.
1000
3.
5000

关键是使用
样式表
元素上的
排除结果前缀
属性


在中有一些很好的解释。

您的意思是,如果不在输出XML中添加前缀,就无法找到使其与默认名称空间一起工作的方法。这在什么方面不起作用?如果不添加前缀,观察到的行为是什么?您用XSLT标记了这一点,所以您的意思可能是XSLT处理程序无法识别工作流/compass命名空间中的pExport元素?需要更多的信息。显示样式表的相关部分可能会有所帮助。好问题(+1)。请参阅我的答案,了解具体示例和使用的解决方案。LarsH,是的,我的意思是,如果不添加前缀,输出XSLT将无法将节点与默认名称空间(not标记)匹配。我正在寻找一种方法来匹配这些元素,而不为默认名称空间添加我自己的前缀。要复制具有相同名称空间的匹配元素,您不需要为输出声明默认名称空间,
copy
指令也以这种方式工作。我认为前缀不应影响名称空间这一点是正确的。从这个意义上说,你的解决方案是有效的。我要寻找的是一种解决方案,它不需要在默认名称空间中添加我自己的前缀。前缀在理论上是不相关的。实际上,有些解析器不符合命名空间,但您仍然希望使用符合命名空间的编写器生成文档。另外,一些基于XML的标准的规范根本不使用名称空间。谢谢,按照您的示例,我通过添加额外的无前缀默认名称空间和“exclude result prefixex”选项使其工作。实际上,我并不完全理解您的代码以及它们应该如何工作(昨天刚刚学习了XSLT)。例如,第一个代码块中的这些部分在做什么?一件小事,在输出XML中,默认名称空间始终是第一个名称空间,我可以将其更改为最后一个名称空间,这是原始XML的位置。@pstar:XSLT和XML W3C规范没有为属性和名称空间节点规定任何特定的顺序。它们的相对顺序是“依赖于实现的”。这意味着,根据您使用的具体XSLT处理器,您对名称空间声明的顺序没有控制权,或者如果您有一些控制权,则该“功能”不可移植,并且不受其他XSLT处理器的支持。@pstar:my code中的
就是我选择的示例。在本例中,转换的目标是在文档中最后一项之后添加新项。
指令的正文包含要添加的实际
项。调用转换时,可以在外部设置全局级别的值。因此,相同的转换可以用于添加不同的项,方法是将它们作为参数传递给转换。感谢Dolment为我指出信息。实际上,我已经读过一点XSLT,但没有找到它。我猜FAQ对我来说有点太多信息了。感谢答案的一个好方法是点击左侧的向上箭头投赞成票。你能帮我做吗?