2017-05-16 4 views
0

要素の繰り返しやxsl IDテンプレートの使用方法については、かなりのスレッドを使いました。しかし、私の要求は、変換を必要とするフィールドのカップルでほとんどの要素を繰り返すことです。要素の変換が少ないXSLT 2.0で繰り返し要素を取得

<?xml version="1.0" encoding="UTF-8"?> 
<Roots xmlns="urn:com.mydish/extps"> 
    <Root> 
     <Worker>100</Worker> 
     <Group></Group> 
     <Amount>1165851.81</Amount> 
     <Currency>USD</Currency> 
     <Check>201705091204</Check> 
     <File_Name>1.pdf</File_Name> 
    </Root> 
    <Root> 
     <Worker>20</Worker> 
     <Group></Group> 
     <Amount>231456.41</Amount> 
     <Currency>USD</Currency> 
     <Check>201705091204</Check> 
     <File_Name>2.pdf</File_Name> 
    </Root> 
</Roots> 

出力がなければならない:

はここに私の入力である

<?xml version="1.0" encoding="UTF-8"?> 
<Roots xmlns="urn:com.mydish/extps"> 
    <Root> 
     <Worker>C10</Worker> 
     <Group>Group1</Group> 
     <Amount>1165851.81</Amount> 
     <Currency>USD</Currency> 
     <Check>201705091204</Check> 
     <File_Name>1.pdf</File_Name> 
    </Root> 
    <Root> 
     <Worker>C20</Worker> 
     <Group>Group2</Group> 
     <Amount>231456.41</Amount> 
     <Currency>USD</Currency> 
     <Check>201705091204</Check> 
     <File_Name>2.pdf</File_Name> 
    </Root> 
</Roots> 

ので、ロジック入力ワーカーの長さに依存している、出力労働者とグループフィールドが変換されます。

入力ワーカーの長さが3桁の場合、出力ワーカーはCと最初の2桁(C10)になり、GroupはGroup1になります。入力作業者の長さが2桁の場合は、Cを連結して(C20)のようにWorkerを出力し、GroupはGroup2になります。

残りは入力と同じである必要があります。

これを変換する方法は? 以下は正しいですか?私はこれがそのままでは動作しないと理解しています。

<Worker> 
    <xsl:value-of select="if string-length(Worker)='3' then concat('C',substring(Worker,1,2)) else concat('C',Worker)" /> 
</Worker> 
<Group> 
    <xsl:value-of select="if string-length(Worker)='3' then 'Group1' else 'Group2'" /> 
</Group>  

答えて

0

は、次のスクリプトを試してみてください。

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:my="urn:com.mydish/extps" 
    xpath-default-namespace="urn:com.mydish/extps"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes" /> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="Worker"> 
    <xsl:copy> 
     <xsl:value-of select="if (string-length() = 3) 
     then concat('C', substring(., 1, 2)) 
     else concat('C', .)" /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Group"> 
    <xsl:copy> 
     <xsl:value-of select="if (string-length(../Worker) = 3) 
     then 'Group1' else 'Group2'" /> 
    </xsl:copy> 
    </xsl:template> 

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

あなたが適切なソリューションにかなり接近していました。

名前空間の処理を追加し、コードを少し変更しました。

たぶん、あなたは学ぶことは少し読んでください:

  • 名前空間の取り扱いについては、のXPath式、
  • 現在のオブジェクトの概念についてデフォルトの名前空間
  • 設定を.)をテンプレートの中に入れ、 その値は何ですか、
  • どのようにするか兄弟オブジェクト(例: 作業員エレメント グループテンプレート。
+0

ありがとうございます。これは機能しています。もちろん、あなたが指摘したトピックを学びます。それは本当に役立ちます。 – user3836593

0

Workerためには、単に行うことができます:

<xsl:template match="Group"> 
    <xsl:copy> 
     <xsl:value-of select="if (string-length(../Worker)=3) then 'Group1' else 'Group2'" /> 
    </xsl:copy> 
</xsl:template> 

これはアイデンティティに加え変換である:Groupについては

<xsl:template match="Worker"> 
    <xsl:copy> 
     <xsl:text>C</xsl:text> 
     <xsl:value-of select="substring(., 1, 2)"/> 
    </xsl:copy> 
</xsl:template> 

は、あなただけのいくつかの構文の修正を必要としますもちろんテンプレート。

+0

また、グループには2つのテンプレートを使用します: 'グループ1' –

関連する問題