2017-07-21 1 views
0

Ich benutze XSL und XPATH, um eine komplexe XML-Datei zu durchlaufen, zu lesen und zu transformieren, wobei ich mehrere Knoten mit gleichen Namen aber unterschiedlichen Werten habe. Meine XML-Beispieldatei ist unten -XML-Dokument mit xpath und xsl durchlaufen

<core> 
    <address> 
     <postalZipCode>90017</postalZipCode> 
     <updateSource>xxxxxx</updateSource> 
     <city>LOS ANGELES</city> 
     <stateProvince>CA</stateProvince> 
     <type>MAILING</type> 
     <line1>818 WEST SEVENTH STREET</line1> 
    </address> 
    <address> 
     <postalZipCode>95014</postalZipCode> 
     <updateSource>xxxxxx</updateSource> 
     <city>CUPERTINO</city> 
     <stateProvince>CA</stateProvince> 
     <type>PRIMARY</type> 
     <line1>1234 XYZ STREET</line1> 
    </address> 
    <memberId>0</memberId> 
</core> 

Wenn ich die Postadresse Zeile 1 Wert gelesen, der Wert I immer bin „1234 XYZ STREET“, die im Wesentlichen die primäre Adresse ist. Hier ist mein xsl Datei-Schnipsel: -

<xsl:template match="core">  
    <xsl:if test="memberId['0'] and address/type['MAILING']"> 
    <fo:table-row> 
     <fo:table-cell><fo:block /></fo:table-cell>      
     <fo:table-cell xsl:use-attribute-sets="data"> 
      <fo:block>Line 1</fo:block> 
     </fo:table-cell> 
     <fo:table-cell xsl:use-attribute-sets="data"> 
      <fo:block><xsl:value-of select="address/line1/text()"/> 
     </fo:block> 
     </fo:table-cell>            
    </fo:table-row> 

Können die Experten hier bitte vorschlagen, wenn es eine andere Art und Weise möglich ist, XSL zu zwingen, den richtigen Wert zu lesen, wo Adresse ist MAILING, statt den ersten Wert liest er feststellt, ???

+0

"* der Wert, den ich bekomme, ist" 1234 XYZ STREET "*" Nein, das ist ** nicht ** Wert, den Sie mit dem Code erhalten, den Sie hier gepostet haben. –

Antwort

1

wenn es eine andere Möglichkeit XSL möglich zu zwingen, ist die richtige Wert zu lesen, wo Adresse ist MAILING, statt Lesen Sie den ersten Wert es findet ???

Ihre Frage ist eher verwirrend, weil MAILING die erste Adresse in Ihrem Beispiel ist - und das Snippet Ihnen zeigen, tut nicht das Ergebnis produzieren Sie sagen, es tut.

<xsl:value-of select="address/line1/text()"/> 

zu:

Auf jeden Fall sicherstellen, dass Sie Daten aus der Postadresse erhalten unabhängig von ihrer Position, dies ändern

<xsl:value-of select="address[type='MAILING']/line1"/> 

das funktioniert Um zu verstehen, wie , lesen Sie mehr über predicates.

1

Der Code, den Sie geschrieben haben, sagt: "Wenn es eine Adresse mit dem Typ MAILING gibt, dann drucke den Wert von address/line1 (unabhängig davon, ob dies in irgendeiner Weise mit der Adresse vom Typ MAILING zusammenhängt)".

Wenn in XSLT 1.0 mehr als einen Knoten auswählt, wird der Wert des zuerst gefundenen Knotens angezeigt. In XSLT 2.0 verkettet es die Werte aller ausgewählten Knoten mit einem Trennzeichen, das standardmäßig auf ein einzelnes Leerzeichen verweist.

Wenn es mehr als einen Knoten gibt und Sie einen bestimmten auswählen möchten, wählen Sie ihn mit einem Prädikat aus, z. xsl:value-of select="address[@type='MAILING']/line1.

+0

"* In XSLT 2.0 ist dies ein Fehler. *" Ich kann nichts in der XSLT 2.0-Spezifikation finden, die einen solchen Fehler beschreibt. Im Gegensatz dazu hat der Befehl "xsl: value-of" sogar ein "separator" -Attribut, um mehrere Knotenauswahlen zu handhaben. –

+0

Entschuldigung, ja, ich habe das falsch verstanden. Die meisten Dinge, die in XSLT 1.0 den ersten Knoten eines Knotensatzes auswählen, werden in XSLT 2.0 zu Fehlern, aber xsl: value-of ist die Ausnahme: Sie ändert alle Knoten im Knotensatz. Die Antwort korrigieren. –