2016-03-25 1 views
-1

Ich habe einige xml, die etwa wie folgt aussieht:xslt Transformation untergeordnete Knoten in einen String zu kombinieren

<Lists> 
<ListA> 
    <Item 
     name = "Name1" 
     ID = "ID1" 
     shoesize = "10"> 
     <AddressList> 
      <Enum>City1</Enum> 
      <Enum>City2</Enum> 
     </AddressList> 
    </Item> 
    <Item 
     name = "Name2" 
     ID = "ID2" 
     shoesize = "13"> 
     <AddressList> 
      <Enum>City3</Enum> 
     </AddressList> 
    </Item> 
</ListA> 
<ListB> 
    ... 
</ListB> 
</Lists> 

Ich brauche eine Transformation, die nur die Elemente in ListA auswählt und erzeugt eine einzige Zeile Rohr-separierte Text pro Stück, flacht aber auch die Adressen in einem Semikolon getrennte Liste wie folgt aus:

Name1|ID1|City1;City2 
Name2|ID2|City3 

Dies ist, was ich bisher getan haben:

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

<xsl:template match="Item"><xsl:value-of select="@name"/>|<xsl:value-of select="@ID"/> 
<xsl:text>&#xa;</xsl:text> 
</xsl:template> 

<xsl:strip-space elements="*"/> 
<xsl:output omit-xml-declaration="yes" indent="yes" /> 
</xsl:stylesheet> 

Ich weiß nicht, wie man die AddressList überschleifen und in ein einzelnes Feld setzen kann. Ich möchte auch ListB ignorieren.

Ich bin mir sicher, dass dies grundlegende Dinge sind, aber ich weiß nicht xslt und alles, was ich gelesen habe, scheint ein gewisses Wissen anzunehmen ... plus ich kann keinen schnellen Anfängerführer finden, der mir genug zum Arbeiten gibt das heraus.

+0

Bitte Posten ** gut ** gebildet Eingabebeispiel - eine, die ein einzelnes Stammelement und keine Leerzeichen in Elementnamen aufweist. –

Antwort

1

Bei einem wohlgeformten Eingang, wie zum Beispiel:

XML

<root> 
    <ListA> 
     <Item name="Name1" ID="ID1" shoesize="10"> 
     <AddressList> 
      <Enum>City1</Enum> 
      <Enum>City2</Enum> 
     </AddressList> 
     </Item> 
     <Item name="Name2" ID="ID2" shoesize="13"> 
     <AddressList> 
      <Enum>City3</Enum> 
     </AddressList> 
     </Item> 
    </ListA> 
    <ListB> 
    ... 
    </ListB> 
</root> 

könnten Sie:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" encoding="UTF-8"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/root"> 
    <xsl:apply-templates select="ListA"/> 
</xsl:template> 

<xsl:template match="Item"> 
    <xsl:value-of select="@name"/> 
    <xsl:text>|</xsl:text> 
    <xsl:value-of select="@ID"/> 
    <xsl:text>|</xsl:text> 
    <xsl:for-each select="AddressList/Enum"> 
     <xsl:value-of select="." /> 
     <xsl:if test="position()!=last()"> 
      <xsl:text>;</xsl:text> 
     </xsl:if> 
    </xsl:for-each> 
    <xsl:text>&#10;</xsl:text> 
</xsl:template> 

</xsl:stylesheet> 

herzustellen:

Name1|ID1|City1;City2 
Name2|ID2|City3