Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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
Xml 如何使用XSLT将多个节点合并为一个节点_Xml_Xslt 1.0_Xslt 2.0 - Fatal编程技术网

Xml 如何使用XSLT将多个节点合并为一个节点

Xml 如何使用XSLT将多个节点合并为一个节点,xml,xslt-1.0,xslt-2.0,Xml,Xslt 1.0,Xslt 2.0,我将此作为我的输入: <name> <n1>nisha</n1> </name> <name> <n1>aisha</n1> </name> <name> <n1>shankar</n1> </name> <surname> iyer </surname> 尼沙 艾莎 香卡 艾耶 我只想将此作为带有名称标记的元素

我将此作为我的输入:

<name>
  <n1>nisha</n1>
</name>
<name>
  <n1>aisha</n1>
</name>
<name>
  <n1>shankar</n1>
</name>
<surname>
iyer
</surname>

尼沙
艾莎
香卡
艾耶
我只想将此作为带有名称标记的元素的输出:

<name>
<n1>nisha</n1>
<n1>aisha</n1>
<n1><shankar</n1>
</name>

尼沙
艾莎

请注意,您的xml文件需要一个根元素,否则无法处理,即:

<names>
  <name>
     <n1>nisha</n1>
  </name>
  ...
</names>

尼沙
...
生成所需输出的简单XSLT样式表是:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" indent="yes" />

  <xsl:template match="/*"> <!-- Or match="/pathToNameElements" -->
    <name>
      <xsl:apply-templates select="name/n1" />
    </name>
  </xsl:template>

  <xsl:template match="name/n1">
    <xsl:copy-of select="." />
  </xsl:template>

</xsl:stylesheet>

就这么简单

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="name[1]">
    <name>
      <xsl:copy-of select="/*/name/*"/>
    </name>
  </xsl:template>
  <xsl:template match="text()"/>
</xsl:stylesheet>
<name>
   <n1>nisha</n1>
   <n1>aisha</n1>
   <n1>shankar</n1>
</name>

将此转换应用于以下XML文档时(提供的文本已更正为格式良好的XML文档):


尼沙
艾莎
香卡
艾耶
产生所需结果

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="name[1]">
    <name>
      <xsl:copy-of select="/*/name/*"/>
    </name>
  </xsl:template>
  <xsl:template match="text()"/>
</xsl:stylesheet>
<name>
   <n1>nisha</n1>
   <n1>aisha</n1>
   <n1>shankar</n1>
</name>

尼沙
艾莎
香卡

正如SMeyer所说,请将XML源文档包装在单个根节点中。请注意,这种方法非常不稳定。首先,它将输出包含的所有元素,而不仅仅是。因此,如果有人添加更多元素,转换就会中断。如果文档中的其他地方有元素,它也会中断。@SMeyer,你无法猜测是否有
的其他子元素,OP是否希望它们也被复制。所以,你的评论只是一种推测,只反映了许多可能性中的一种。另一方面,当我们得到一个特定的XML文档时,最好为该文档生成最短、最高效和最直接的解决方案。我已经为更一般和更复杂的问题演示了简短的解决方案——只要看看我的5000多个答案。当然你是对的,没有更详细的要求,我们只能推测可能的副作用。就我个人而言,我试图“捕捉”预期数据,以尽量减少意外。这对某些人来说可能过于冗长,但在过去对我很有帮助。在任何情况下,这两个答案都可以解决指定的问题。