2016-03-25 13 views
0

次のソースXMLがあります。これは会計ソフトウェアにインポートするために変換する必要があります。簡単に言えば、結果として得られるXMLには、静的ヘッダーと複数行(ソースXML上にProject Ledger Lineごとに1行)が必要です。会計項目には多くの違いがあるため、経費とタイムシートの別のテンプレートを選択したいと思います。 1つの例はアカウントコードです。以下の例は非常にです。はアカウントコードを区別するためにのみ使用されていますが、他にも多くの違いがあります。私の現在の変換で問題となっているのは、何らかの理由で2つではなく1つの行しか得られないということです。 、助け子どもに基づくXSLTの異なるテンプレート

はあなたに感謝し、

あなたがこのプロジェクトにアクセスできる場所ですしてください: http://xsltransform.net/jyRYYjg/1

ソースXML:

<?xml version="1.0" encoding="utf-8"?> 
    <TIMEATWORK xsl:version="1.0" server="localhost" database="TAW_TTC" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <PROJECT_LEDGER_LINE> 
      <CalcVal11>600</CalcVal11> 
      <Orig_Trans_Type>TIMESHEET</Orig_Trans_Type> 
      <Project_Company_Accounts> 
        <Proj_AccName1>70600000</Proj_AccName1> 
        <Proj_AccName2>46141101</Proj_AccName2> 
      </Project_Company_Accounts> 
     </PROJECT_LEDGER_LINE> 
     <PROJECT_LEDGER_LINE> 
      <CalcVal11>50</CalcVal11> 
      <Orig_Trans_Type>EXPENSE</Orig_Trans_Type> 
      <Project_Company_Accounts> 
        <Proj_AccName1>70600000</Proj_AccName1> 
        <Proj_AccName2>46141101</Proj_AccName2> 
      </Project_Company_Accounts> 
     </PROJECT_LEDGER_LINE> 
    </TIMEATWORK> 

XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:user="http://llpgroup.com/TAWnamespace" 
    exclude-result-prefixes="msxsl user" > 
    <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes" /> 

    <xsl:template match="TIMEATWORK"> 
    <SSC> 
     <Header> 
      <BudgetCode>A</BudgetCode> 
     </Header> 
     <Details> 
      <Ledger> 
       <xsl:apply-templates select="PROJECT_LEDGER_LINE"> 
        <xsl:sort select="Orig_Trans_Type"/> 
       </xsl:apply-templates> 
      </Ledger> 
     </Details> 
    </SSC> 

    </xsl:template> 

    <xsl:template match="PROJECT_LEDGER_LINE"> 
    <xsl:if test="Orig_Trans_Type = 'TIMESHEET'"> 
     <Line> 
      <AccountCode><xsl:value-of select="Project_Company_Accounts/Proj_AccName1"/></AccountCode> 
      <CurrencyCode><xsl:value-of select="CalcVal11"/></CurrencyCode> 
      <DebitCredit>D</DebitCredit> 
     </Line> 
    </xsl:if> 
    </xsl:template> 

    <xsl:template match="PROJECT_LEDGER_LINE"> 
    <xsl:if test="Orig_Trans_Type = 'EXPENSE'"> 
     <Line> 
      <AccountCode><xsl:value-of select="Project_Company_Accounts/Proj_AccName2"/></AccountCode> 
      <CurrencyCode><xsl:value-of select="CalcVal11"/></CurrencyCode> 
      <DebitCredit>D</DebitCredit> 
     </Line> 
    </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

所望の出力:

<?xml version="1.0" encoding="utf-8"?> 
<SSC> 
    <Header> 
     <BudgetCode>A</BudgetCode> 
    </Header> 
    <Details> 
     <Ledger> 
      <Line> 
      <AccountCode>70600000</AccountCode> 
      <CurrencyCode>600</CurrencyCode> 
      <DebitCredit>D</DebitCredit> 
     </Line> 
     <Line> 
      <AccountCode>46141101</AccountCode> 
      <CurrencyCode>50</CurrencyCode> 
      <DebitCredit>D</DebitCredit> 
     </Line> 
     </Ledger> 
    </Details> 
</SSC> 

答えて

1

同じノードに一致する2つ(またはそれ以上)のテンプレートがある場合、そのうちの1つだけが適用されます。

あなたは各テンプレートを持つようにしたい場合は代わりにxsl:if述語を使用し、同じノードの異なるタイプに適用されるが、例えば:

<xsl:template match="PROJECT_LEDGER_LINE[Orig_Trans_Type = 'TIMESHEET']"> 
    <Line> 
     <AccountCode><xsl:value-of select="Project_Company_Accounts/Proj_AccName1"/></AccountCode> 
     <CurrencyCode><xsl:value-of select="CalcVal11"/></CurrencyCode> 
     <DebitCredit>D</DebitCredit> 
    </Line> 
</xsl:template> 

<xsl:template match="PROJECT_LEDGER_LINE[Orig_Trans_Type = 'EXPENSE']"> 
    <Line> 
     <AccountCode><xsl:value-of select="Project_Company_Accounts/Proj_AccName2"/></AccountCode> 
     <CurrencyCode><xsl:value-of select="CalcVal11"/></CurrencyCode> 
     <DebitCredit>D</DebitCredit> 
    </Line> 
</xsl:template> 
関連する問題