2016-11-25 91 views
2

我有这个作为我输入:如何将多个节点与XSLT结合成一个

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

正如SMeyer所述,请将您的XML源文档包装在单个根节点中。 – Madeyedexter

回答

0

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

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

一个简单的XSLT样式表,它产生所需的ou tput的是:

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

像这样简单

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

当在下面的XML文档(所提供的文本被施加这种转变,修正为一个良好的XML文档):

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

想要的结果产生

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

请注意,这种方法是相当不稳定的。首先,它将输出中包含的所有元素,而不仅仅是。因此,如果有人添加更多元素,转换将会中断。如果在文档的其他地方有元素,它也会中断。 – Meyer

+0

@SMeyer,我们不能猜测与否,如果有'的'其他儿童,OP会或不会希望他们也将被复制。所以,你的评论仅仅是一种反映多种可能性的猜测。 **另一方面**,当我们得到一个特定的XML文档时,最好为这个文档生成最短,最有效和最直接的解决方案。我已经展示了针对更普遍和相关问题的简短解决方案 - 只需查看我的5000多个答案即可。 –

+0

当然你是对的,没有更详细的要求,我们只能推测可能的副作用。就我个人而言,我试图“捕捉”只有预期的数据,以尽量减少意外。对于某些人来说这可能太冗长了,但过去对我很好。无论如何,这两个答案都能按照规定解决问题。 – Meyer