2016-11-25 3 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, который производит необходимую НУ 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