2017-06-13 16 views
0

今日はかなり基本的な質問があります。なぜ、すべての要素の属性が並んでいないのですか? (Bene_DOBが、その後DOB_DEPを使用して存在していない場合)XSLTテンプレートを適用して同じ行にはない

私の所望の出力は次のように
"LAST_NAME"、 "FIRST_NAME"、 "DOB" です:
"ギブソン"、 "メル"、「1965-01- 01"
"ノリス"、 "チャック"

しかし、私は取得しています:

"ノリス"、 "ギブソン"、 "チャック"、 "メル"、

1965年1月1日 12345から01

1965年1月1日
12345から01

私はこのXML

<?xml version='1.0' encoding='UTF-8'?> 
<wd:Report_Data xmlns:wd="urn:com.workday.report/BCBSLA_CR_OFAC_BENE"> 
<wd:Report_Entry> 
<wd:BENE_ALL> 
    <wd:Last_Name>Norris</wd:Last_Name> 
    <wd:First_Name>Chuck</wd:First_Name> 
    <wd:REF_ID>12345-01</wd:REF_ID> 
</wd:BENE_ALL>  
    <wd:Last_Name>Gibson</wd:Last_Name> 
    <wd:First_Name>Mel</wd:First_Name> 
    <wd:REF_ID>12345-02</wd:REF_ID> 
</wd:BENE_ALL> 
<wd:BENE_PEOPLE> 
    <wd:BENE_DOB>1965-01-02</wd:BENE_DOB> 
    <wd:Ben_Ref_ID>12345-01</wd:Ben_Ref_ID> 
</wd:BENE_PEOPLE> 
<wd:BENE_PEOPLE> 
    <wd:BENE_DOB>1955-01-10</wd:BENE_DOB> 
    <wd:Ben_Ref_ID>12345-02</wd:Ben_Ref_ID> 
</wd:BENE_PEOPLE> 
<wd:DEP> 
    <wd:DOB_Dep>1965-01-01</wd:DOB_Dep> 
    <wd:Dep_Ref_ID>12345-01</wd:Dep_Ref_ID> 
</wd:DEP> 
</wd:Report_Entry> 

は、ここに私のXSLTだています

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       exclude-result-prefixes="xsl" 
       xmlns:wd="urn:com.workday.report/BCBSLA_CR_OFAC_BENE" 
       version="2.0"> 


    <xsl:output method="text"/> 


    <xsl:template match="/"> 
    <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="wd:BENE_ALL"> 
    <xsl:apply-templates select="wd:EMPLID" mode="csv"/> 
    <xsl:apply-templates select="wd:Last_Name" mode="csv"/> 
    <xsl:apply-templates select="wd:First_Name" mode="csv"/> 
    </xsl:template> 


    <xsl:template match="wd:BENE_People"> 
    <xsl:apply-templates select="wd:DOB_Bene" mode="csv" /> 
    </xsl:template> 


    <!--<xsl:choose> 
     <xsl:when test= 
    </xsl:choose>--> 


    <xsl:template match="*" mode="csv"> 
    <xsl:value-of select="concat('&quot;', ., '&quot;,')" /> 
    </xsl:template> 

    <xsl:template match="*" mode="csv-nl"> 
    <xsl:value-of select="concat('&quot;', ., '&quot;&#xA;')" /> 
    </xsl:template> 

</xsl:stylesheet> 

助けてくれてありがとう!

+0

あなたが例を投稿できるの

<xsl:function name="my:quote"> <xsl:param name="text"/> <xsl:sequence select="concat('&quot;', $text, '&quot;')" /> </xsl:function> 

、その後、複数の 'wd:BENE_DOB'と' wd:DOB_Dep'を使っていますか? –

答えて

1

XMLの構造が正しく分かっている場合は、Last_Nameで始まる要素のグループごとに新しいデータ行を作成する必要があります。

<xsl:template match="/Report_Data"> 
    <xsl:for-each-group select="Report_Entry/BENE_ALL/*" group-starting-with="Last_Name"> 
     <xsl:value-of select="concat('&quot;', ., '&quot;,')" /> 
     <xsl:value-of select="concat('&quot;', current-group()[self::First_Name], '&quot;&#10;')" /> 
    </xsl:for-each-group> 
</xsl:template> 

を返す:XSLT 2.0で、これはやってすることによって達成することができる

XSLT:

"Norris","Chuck" 
"Gibson","Mel" 

Bene_DOB値を追加するには、このようなkeyを使用することができます2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xpath-default-namespace="urn:com.workday.report/BCBSLA_CR_OFAC_BENE"> 
<xsl:output method="text" encoding="UTF-8"/> 

<xsl:key name="person-dob" match="BENE_DOB" use="following-sibling::Ben_Ref_ID[1]" /> 

<xsl:template match="/Report_Data"> 
    <xsl:for-each-group select="Report_Entry/BENE_ALL/*" group-starting-with="Last_Name"> 
     <xsl:value-of select="concat('&quot;', ., '&quot;,')" /> 
     <xsl:value-of select="concat('&quot;', current-group()[self::First_Name], '&quot;,')" /> 
     <xsl:value-of select="concat('&quot;', key('person-dob', current-group()[self::REF_ID]), '&quot;&#10;')" /> 
    </xsl:for-each-group> 
</xsl:template> 

</xsl:stylesheet> 

デモ:http://xsltransform.net/naZXpX2

これはキーがBENE_DOBBen_Ref_IDのペアに記載されていると仮定されます。


あなたが好きなら、あなたはとしての機能を定義することにより、コードの重複を減らすことができる:

<xsl:template match="/Report_Data"> 
    <xsl:for-each-group select="Report_Entry/BENE_ALL/*" group-starting-with="Last_Name"> 
     <xsl:value-of select="my:quote(.), my:quote(current-group()[self::First_Name]), my:quote(key('person-dob', current-group()[self::REF_ID]))" separator=","/> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:for-each-group> 
</xsl:template> 

デモ:http://xsltransform.net/naZXpX2/1

+0

Michaelありがとうございました。私はvalue-ofを使用して書き直しました。これは、1行に表示されないアイテムの問題を解決しました。ありがとう!私はXSLT 1.0を持っているので、キーは私のために働いていません。 – BWatkins

+0

@BWatkinsオリジナルのスタイルシートは 'version =" 2とタグ付けされています。0 "と書かれているので、あなたのプロセッサーがサポートしているものと仮定しました。いずれの場合でも、XSLT 1.0ではキーが機能しますが、' xsl:for-each-group'は更新されません。 。 –

関連する問題