2017-08-28 5 views
0

Basierend auf dem folgenden Eingabe-XML: Wenn das Bestellelement vom Typ "desktop" auf der übergeordneten Ebene ist, aktualisieren Sie den Preis aller untergeordneten Elemente wie Elternpreis. orderitem ist rekursiv und kann 1-n Bestellpositionen enthalten. Für simplicity dachte ich 3 Kinder und 1 Eltern orderitem. Ich habe eine andere Frage, die Abhängigkeit beinhaltet, d. H. Wenn Eltern eine Objectid hat und es mit Objectid des Kindes übereinstimmt, dann aktualisieren Sie den Preis. Aber ich werde als eine neue Frage stellen, sobald das gelöst ist. Danke.XSLT-Wert von übergeordnetem Element in untergeordnetes Element basierend auf dem Wert eines bestimmten Elements

<listoforders> 
<Orderitem> 
    <name>Desktop</name> 
    <place>NZ</place> 
    <price>120</price> 
    <Orderitem> 
    <name>Desktop2</name> 
    <place>NZ</place> 
    <price>130</price> 
    </Orderitem> 
    <Orderitem> 
    <name>Desktop3</name> 
    <place>NZ</place> 
    <price>130</price> 
    </Orderitem> 
</Orderitem> 
</listoforders> 

Ergebnis:

<listoforders> 
    <Orderitem> 
    <name>Desktop</name> 
    <place>NZ</place> 
    <price>120</price> 
    <Orderitem> 
    <name>Desktop2</name> 
    <place>NZ</place> 
    <price>120</price> 
    </Orderitem> 
    <Orderitem> 
    <name>Desktop3</name> 
    <place>NZ</place> 
    <price>120</price> 
    </Orderitem> 
</Orderitem> 
</listoforders>  

scheint einfach, aber ich bin nicht in der Lage es über die Identität der Regel zu tun. Muss ich for-each hier verwenden?

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 
<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="orderitem[name='Desktop']/price"> 
<xsl:variable name="temp" select="*[(self::price)]"/> 
<xsl:copy> 
    <xsl:value-of select=$temp </xsl:value-of> 
    <xsl:apply-templates select="*[(child::price)]"/> 
</xsl:copy>  
</xsl:template> 
</xsl:stylesheet> 

Vielen Dank im Voraus.

Grüße Krish

Antwort

0

Wie wäre:

XSLT 1,0

<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:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="price[../../name='Desktop']"> 
    <xsl:copy-of select="../../price"/>   
</xsl:template> 

</xsl:stylesheet> 
+0

Dank Michael, können Sie mir freundlicherweise diese bitte helfen, zu verstehen. Was ich verstanden habe, ist .. wir passen zum Preiselement, das den Namen 'Desktop' hat, zwei Generationen aufwärts und dann den Preis durch Auswahl des Elternpreises kopiert. Ich bin etwas verwirrt, wie es funktioniert. Vielen Dank. – Krish

+0

Wir stimmen mit 'Price' überein, dessen Großelternname" Desktop "ist, und kopiert dann den Preis vom Großelternteil. Das gleiche gilt für den Preis von 'Orderitem', dessen Name" Desktop "lautet. Wir wollen nur den Preis ändern, also ist das schlaue Ding, es direkt zu treffen, nicht sein Elternteil. –

+0

Wie also wendet es den Preis auf seine Kindelemente an (und nicht den Preis in einem anderen Bestellelement). Ist es implizit? Es ist nicht unbedingt ein Großelternteil, es kann auch Eltern sein. – Krish

Verwandte Themen