2016-08-01 23 views
0

Wir haben XML-Eingabe. Wir haben versucht, einen konstanten Wert unter Verwendung des Elements <LineActionType> zu setzen.XSLT: Wie i Konstanten Wert zuweisen XML-Element mit

Wir wollen im Grunde <LineActionType >A<LineActionType /> dieses Element konstanten Wert auf jeder Kommentarzeile Tag hinzuzufügen. die

<CommentLine> 
        <Comment>Comment#1</Comment> 
        <OrderLineID>OR-1810143</OrderLineID> 
        <UserDefined>3</UserDefined> 
        <LineActionType >A<LineActionType /> 
       </CommentLine> 

XML-Input-

<?xml version="1.0" encoding="UTF-8"?> 
<SalesOrders xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="SORTOIDOC.XSD"> 
    <Orders> 
     <OrderHeader> 
     <CustomerPoNumber>Manual Order 1</CustomerPoNumber> 
     <OrderActionType>A</OrderActionType> 
     </OrderHeader> 
     <OrderDetails> 
     <StockLine> 
      <CustomerPoLine>9999</CustomerPoLine> 
      <StockCode>abc-1</StockCode> 
      <StockDescription>ASSEMBLED</StockDescription> 
      <OrderQty>2.0</OrderQty> 
      <OrderUom>EA</OrderUom> 
      <PriceUom>EA</PriceUom> 
      <AlwaysUsePriceEntered>Y</AlwaysUsePriceEntered> 
      <UserDefined>1</UserDefined> 
      <OrderLineID>OR-1810141</OrderLineID> 
     </StockLine> 
     <StockLine> 
      <CustomerPoLine>9999</CustomerPoLine> 
      <StockCode>FBX-SMO30029-8</StockCode> 
      <StockDescription>TARGET SOAP PDQ 2014 ASSEMBLED</StockDescription> 
      <OrderQty>3.0</OrderQty> 
      <OrderUom>EA</OrderUom> 
      <PriceUom>EA</PriceUom> 
      <AlwaysUsePriceEntered>Y</AlwaysUsePriceEntered> 
      <UserDefined>2</UserDefined> 
      <OrderLineID>OR-1810142</OrderLineID> 
     </StockLine> 
     <CommentLine> 
      <Comment>Comment#1</Comment> 
      <OrderLineID>OR-1810143</OrderLineID> 
      <UserDefined>3</UserDefined> 
      <LineActionType /> 
     </CommentLine> 
     <CommentLine> 
      <Comment>Comment#2</Comment> 
      <OrderLineID>OR-1810144</OrderLineID> 
      <UserDefined>4</UserDefined> 
      <LineActionType /> 
     </CommentLine> 
     </OrderDetails> 
    </Orders> 
</SalesOrders> 

Wir haben versucht, folgende XSLT 2.0:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0"> 
    <xsl:output method="xml" encoding="Windows-1252" indent="yes" /> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="OrderDetails"> 
     <xsl:copy> 
     <xsl:apply-templates select="*"> 
      <xsl:sort select="xs:integer(UserDefined)" /> 
     </xsl:apply-templates> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="StockLine[not(StockCodeDescription) and not (OrderQty) and not(Price)]"> 
     <CommentLine> 
     <Comment> 
      <xsl:value-of select="StockCode" /> 
     </Comment> 
     <xsl:copy-of select="OrderLineID" /> 
     <xsl:copy-of select="UserDefined" /> 
     </CommentLine> 
    </xsl:template> 
    <xsl:template match="CommentLine[OrderLineID = preceding-sibling::StockLine/OrderLineID and not(Comment)]" /> 
    <xsl:template match="CommentLine[some $sib in preceding-sibling::CommentLine satisfies deep-equal(., $sib)]" /> 
</xsl:stylesheet> 

ERWARTETES ERGEBNIS:

<?xml version="1.0" encoding="UTF-8"?> 
<SalesOrders xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="SORTOIDOC.XSD"> 
    <Orders> 
     <OrderHeader> 
     <CustomerPoNumber>Manual Order 1</CustomerPoNumber> 
     <OrderActionType>A</OrderActionType> 
     </OrderHeader> 
     <OrderDetails> 
     <StockLine> 
      <CustomerPoLine>9999</CustomerPoLine> 
      <StockCode>abc-1</StockCode> 
      <StockDescription>ASSEMBLED</StockDescription> 
      <OrderQty>2.0</OrderQty> 
      <OrderUom>EA</OrderUom> 
      <PriceUom>EA</PriceUom> 
      <AlwaysUsePriceEntered>Y</AlwaysUsePriceEntered> 
      <UserDefined>1</UserDefined> 
      <OrderLineID>OR-1810141</OrderLineID> 
     </StockLine> 
     <StockLine> 
      <CustomerPoLine>9999</CustomerPoLine> 
      <StockCode>FBX-SMO30029-8</StockCode> 
      <StockDescription>TARGET SOAP PDQ 2014 ASSEMBLED</StockDescription> 
      <OrderQty>3.0</OrderQty> 
      <OrderUom>EA</OrderUom> 
      <PriceUom>EA</PriceUom> 
      <AlwaysUsePriceEntered>Y</AlwaysUsePriceEntered> 
      <UserDefined>2</UserDefined> 
      <OrderLineID>OR-1810142</OrderLineID> 
     </StockLine> 
     <CommentLine> 
      <Comment>Comment#1</Comment> 
      <OrderLineID>OR-1810143</OrderLineID> 
      <UserDefined>3</UserDefined> 
      <LineActionType >A<LineActionType /> 
     </CommentLine> 
     <CommentLine> 
      <Comment>Comment#2</Comment> 
      <OrderLineID>OR-1810144</OrderLineID> 
      <UserDefined>4</UserDefined> 
      <LineActionType >A<LineActionType /> 
     </CommentLine> 
     </OrderDetails> 
    </Orders> 
</SalesOrders> 

Jede Hilfe auf es wäre sehr willkommen ?

+0

Haben Sie debuggen Code? –

Antwort

2

Beachten Sie zuerst, dass <LineActionType >A<LineActionType /> nicht gültige XML ist, also nehme ich an, Sie meinen <LineActionType>A</LineActionType>.

Wie dem auch sei, wenn alle CommentLine Elemente eine LineActionType hatte und man wollte nur, sie alle zu A setzen, könnten Sie einfach diese Vorlage hinzufügen, zusammen mit dem Identity-Vorlage

<xsl:template match="CommentLine/LineActionType"> 
    <xsl:copy>A</xsl:copy> 
</xsl:template> 

Alternativ, wenn LineActionType nicht immer vorhanden ist Unter einem CommentLine können Sie versuchen, stattdessen diese zwei Vorlagen hinzuzufügen. Eine hinzuzufügen es unter jedem CommentLine und eine andere beliebige vorhandene ausgegeben zu verhindern (so dass sie nicht zweimal ausgegeben bekommt)

<xsl:template match="CommentLine"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
     <LineActionType>A</LineActionType> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="CommentLine/LineActionType" /> 
+0

Wenn ich versuche, beide gegebenen Vorlagen anzuwenden. Es hat nicht für mich funktioniert. – NEO

+0

es erzeugt keinen Syntaxfehler. aber auch keinen konstanten Wert erzeugen. – NEO

+0

Siehe http://xsltransform.net/pPJ8LUM oder http://xsltransform.net/bwdwru die beiden Möglichkeiten in Aktion zu sehen, die beide Ihre erwartete Ausgabe erzeugen auf der Basis der Eingabe. Ein Ding vorsichtig sein, ist das Hinzufügen von anderen Vorlagen zu Ihrem XSLT, die auch 'CommentLine' Übereinstimmen, so können Sie ein' priority' Attribut hinzufügen müssen. Auch die XSLT in Ihrer Frage haben Sie eine Vorlage, die eine 'CommentLine' von einem' StockLine' schafft. Wenn Sie möchten, dass dies auch 'LineActionType' enthält, fügen Sie es einfach als Teil dieser bestehenden Vorlage hinzu. –