2017-06-07 24 views
0

xsltを使用していくつかの条件に基づいてxmlのフィールドの値を変更する必要があります。xsltを使用して条件に基づいてxmlフィールドの値を変更

私の入力XML:

<?xml version="1.0" encoding="UTF-8"?> 
<rows> 
    <item> 
     <Name>ABC</Name> 
     <ID>1234</ID> 
    </item> 
    <item> 
     <Name>XYX</Name> 
     <ID>234</ID> 
    </item> 
    <item> 
     <Name>PXC</Name> 
     <ID>456</ID> 
    </item> 
</rows> 

私のXSLコード:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:variable name="ID" select="/rows/item/ID"/> 
    <xsl:template match="/rows/item/ID"> 
     <xsl:choose> 
      <xsl:when test="$ID = '1234'">1001</xsl:when> 
      <xsl:when test="$ID = '234'">1002</xsl:when> 
      <xsl:when test="$ID = '456'">1003</xsl:when> 
      <xsl:when test="$ID = '789'">1004</xsl:when> 
      <xsl:when test="$ID = '1903'">1005</xsl:when> 
      <xsl:otherwise> 
       <xsl:message terminate="no">SEVERE: No ID Mapping is found <xsl:value-of select="$ID"/> 
       </xsl:message> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

出力XML:

<rows> 
    <item> 
     <Name>ABC</Name> 
     1001 
    </item> 
    <item> 
     <Name>XYX</Name> 
     1001 
    </item> 
    <item> 
     <Name>PXC</Name> 
     1001 
    </item> 
</rows> 

私は私の選択に基づいて変更するにはIDフィールドの値を期待しています調子。そして、選択条件で維持されていない値が来たら、それはエラーを投げるべきです。

しかし、出力xmlにはIDフィールドのxmlタグがありません。また、最初の選択条件の値が以下の項目に適用されます。親切にコードを修正するのに役立ちます。

+0

は、あなただけのタグを追加しますか?または、各IDに異なる出力値を設定することもできますか? –

+0

私の選択条件に基づいて異なる値と選択条件が一致しない場合はエラーをスローします。質問が更新されました。申し訳ありませんが明確ではありません。 – KiranSK

答えて

0

欠けているタグを追加するには、テンプレートの内容をxsl:copy命令の中に置きます。または、テンプレートをID内のテキストノードのみに一致するように変更します。

ここでも別の問題があると思われます。 XSLT変数は、式ではなく値を格納します。あなたの例では、ID変数は1001(最初のitemのID)の値を格納し、出力が示すようにすべてitemに複製されます。実際の出力をそれぞれID個の値で判別する場合は、グローバル変数を使用することはできません。

は、代わりに次の方法を試してみてください:

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="ID"> 
    <xsl:copy> 
     <xsl:choose> 
      <xsl:when test=". = '1234'">1001</xsl:when> 
      <xsl:when test=". = '234'">1002</xsl:when> 
      <xsl:when test=". = '456'">1003</xsl:when> 
      <xsl:when test=". = '789'">1004</xsl:when> 
      <xsl:when test=". = '1903'">1005</xsl:when> 
      <xsl:otherwise> 
       <xsl:message terminate="no">SEVERE: No ID Mapping is found <xsl:value-of select="."/></xsl:message> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet>