2016-08-01 10 views
0

XMLを入力しました。そこで、<LineActionType>要素を使って一定値を入れようとしました。XSLT:XML要素を使用して定数値を割り当てる方法

基本的には、この要素の定数値を各コメント行タグに<LineActionType >A<LineActionType />と追加します。

<?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> 

予想される出力:

<?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> 

その上に任意のヘルプははるかに高く評価されるだろう私たちは、次のXSLT 2.0を試してみました

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

入力XML

<?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> 

ある ?

+0

あなたのコードをデバッグしましたか? –

答えて

2

まず、<LineActionType >A<LineActionType />は有効なXMLではないことに注意してください。つまり、<LineActionType>A</LineActionType>を意味すると仮定しています。とにかく

、すべてCommentLine要素がLineActionTypeを持っていたあなただけAにそれらすべてを設定したいLineActionTypeが常に存在しない場合、あなただけの、アイデンティティーテンプレートまた

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

と一緒にこのテンプレートを追加することができればCommentLineの下に、代わりにこれらの2つのテンプレートを追加することができます。任意のCommentLineの下にそれを追加するための一つ、と(それが二回出力を取得しないように)既存の1が出力されるのを防ぐために別の

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

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

私は両方の与えられたテンプレートを適用しようとしています。それは私のために働かなかった。 – NEO

+0

構文エラーが発生していません。一定の価値を創造していない。 – NEO

+0

http://xsltransform.net/pPJ8LUMまたはhttp://xsltransform.net/bwdwruを参照して、2つの可能性を確認してください。両方とも入力に基づいて期待される出力が得られます。注意すべき点の1つは、 'CommentLine'にもマッチする他のテンプレートをXSLTに追加することです。したがって、' priority'属性を追加する必要があります。また、あなたの質問のXSLTには 'StockLine'から' CommentLine'を作成するテンプレートがあります。これに 'LineActionType'も含めたければ、既存のテンプレートの一部として追加するだけです。 –

関連する問題