2017-03-24 4 views
0

Ich brauche die Daten des Elements priorize zu bekommen. Ich habe eine Bedingung, müssen die <AAA> zuerst, wenn es nicht null ist. Sonst bekomme ich die Daten von <BBB>. Das Elternelement <ParentElem> von <BBB> kann viele Male auftreten, so habe ich zum Beispiel 3 <ParentElem>, ich muss den gesamten Wert von <BBB> verketten. Unten ist meine XML-Datei, in der das <AAA> Element NULL ist. In diesem Fall erhalte ich den Wert vom <BBB> Element.Verketten Sie alle Daten mit XSLT

INPUT

<RootElem> 
    <DataRec> 
     <Struc> 
      <AAA></AAA> 
     </Struc> 
     <ParentElem> 
      <Docu> 
       <BBB>11111</BBB> 
      </Docu> 
     </ParentElem> 
     <ParentElem> 
      <Docu> 
       <BBB>22222</BBB> 
      </Docu> 
     </ParentElem> 
     <ParentElem> 
      <Docu> 
       <BBB>33333</BBB> 
      </Docu> 
     </ParentElem> 
    </DataRec> 
</RootElem> 

ERWARTETES ERGEBNIS

<ID>111112222233333</ID> 

XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml"/> 
<xsl:strip-space elements="*"/> 
<xsl:template match="/"> 
    <xsl:choose> 
     <xsl:when test="not(normalize-space(/RootElem/DataRec/Struc/AAA)='')"> 
      <ID> 
       <xsl:value-of select="/RootElem/DataRec/Struc/AAA"/> 
      </ID> 
     </xsl:when> 
     <xsl:when test="not(normalize-space(/RootElem/DataRec/ParentElem/Docu/BBB)='')"> 
      <xsl:for-each select="/RootElem/DataRec/ParentElem"> 
       <ID> 
        <xsl:value-of select="concat(./Docu/BBB)"/> 
       </ID> 
      </xsl:for-each> 
     </xsl:when> 
    </xsl:choose> 
</xsl:template> 
</xsl:stylesheet> 

Ich weiß nicht, wie zu tun die Verkettung für jedes Auftreten von <BBB>. Ist es möglich, es in XSLT zu tun? Ich benutze XSLT 2.0

Vielen Dank.

Antwort

0

ich meistens bin zu raten, hier, aber versuchen:

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

<xsl:template match="/RootElem"> 
    <xsl:choose> 
     <xsl:when test="DataRec/Struc/AAA[normalize-space()]"> 
      <ID> 
       <xsl:apply-templates select="DataRec/Struc/AAA"/> 
      </ID> 
     </xsl:when> 
     <xsl:when test="DataRec/ParentElem/Docu/BBB[normalize-space()]"> 
      <ID> 
       <xsl:apply-templates select="DataRec/ParentElem/Docu/BBB"/> 
      </ID> 
     </xsl:when> 
    </xsl:choose> 
</xsl:template> 

</xsl:stylesheet> 

Arbeits Demo:
(a) http://xsltransform.net/94AbWCc
(b) http://xsltransform.net/94AbWCc/1

+0

Th Ank you @ michael.hor257k für das Feedback. – Nathan

2

einfachste Lösung ist vielleicht

<ID> 
    <xsl:value-of select="(.//AAA/text(), string-join(.//BBB, ''))[1]"/> 
</ID> 
+0

Vielen Dank @Michael Kay für das Feedback. – Nathan

Verwandte Themen