2016-04-28 7 views
0

Ich habe eine XML mit der folgenden StrukturSelektiv Verketten alle Elementwerte von Subknoten

<Group> 
    <Note/> 
    <Type>Anaerobic</Type> 
    </Group> 
    <Group> 
    <Note>Note B</Note> 
    <Type>Type B</Type> 
    </Group> 
    <Group> 
    <Note>Note C</Note> 
    <Type>Type C</Type> 
    </Group> 
    <Group> 
    <Note>Note D</Note> 
    <Type>Type D</Type> 
    </Group> 

ich brauche die Inhalte der Knoten in einem einzigen Element selektiv zu fusionieren wie folgt.

<Group_Note> Note B Type B , Note c Type C , Note D Type D</Group_Note> 

Wie Sie die <Type> mit dem Wert sehen kann ‚Anaerobe‘ hat mit dem Rest verketteten zusammen nicht. Ich bin in der Lage, alle Werte in einer einzigen Zeichenfolge mit dem folgenden Code zu erhalten.

Wie kann ich selektiv die Knoten auswählen und auswählen, die verkettet werden sollen. Jede Hilfe ist sehr

geschätzt
+0

Ist das Weglassen von ‚Anaerobe‘ einen Fehler, den Sie zu beheben versuchen, oder die Anforderung, um Sie zu treffen versuchen, und der Grund, warum Sie nicht nur 'String mit () '? –

Antwort

0

Eine Möglichkeit, dies zu erreichen, wird mit dem folgenden XSLT, die iteriert über nicht leere Note Elemente und wählt alle absteigend text() Knoten:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/root"> <!-- choose whatever root element you have --> 
    <Group_Note> 
     <xsl:for-each select="Group/*[../Note/text() != '']"> 
     <xsl:value-of select=".//text()"/> 
     <xsl:if test="position()!=last()"> <!-- no space after last element --> 
      <xsl:text> </xsl:text> 
     </xsl:if> 
     </xsl:for-each> 
    </Group_Note> 
    </xsl:template> 

</xsl:stylesheet> 

Die Ausgabe lautet:

<?xml version="1.0"?> 
<Group_Note>Note B Type B Note C Type C Note D Type D</Group_Note> 

Wenn Sie

<xsl:value-of select="concat(Group[Note='']/Type,' ')" /> 

vor <xsl:for-each select="Group/*[../Note/text() != '']"> einsetzen, werden Sie die Anaerobic ‚s Type Attribut am Anfang bekommen - bevor die anderen text() Knoten zu akkumulieren.

Beachten Sie, dass ich den Anaerobic Knoten von den anderen diskriminierte, indem ich nach einem leeren <Note /> suchte. Wenn Ihre Anforderungen anders sind, müssten Sie die Prädikate anpassen.

Das Endergebnis ist:

<?xml version="1.0"?> 
<Group_Note>Anaerobic Note B Type B Note C Type C Note D Type D</Group_Note> 
+0

Danke für die Lösung. Wie ändere ich es so, dass ich während der Verkettung mit Anerobic als erstes zufrieden bin? Zum Beispiel wenn Anaerobic am Ende ist? Anmerkung Hinweis B Typ B Note C Typ C Hinweis D Anaerob

0

so etwas wie dieses Versuchen:

<xsl:template match="/*"> 
    <Group_Note> 
    <xsl:apply-templates select="Group"/> 
    </Group_Note> 
</xsl:template> 

<xsl:template match="Group"/> 

<xsl:template match="Group[Note != '' and Type != '']"> 
    <xsl:if test="preceding-sibling::Group[Note != '' 
       and Type != '']">,</xsl:if> 
    <xsl:value-of select="concat(Note, ' ', Type)" /> 
</xsl:template>