2017-05-22 23 views
0

XSLT 2.0バージョンのヘルプをお探しですか?ここでXSLT 2.0 - 値と属性によるフィルタリング

はXMLである:ここでは

<?xml version='1.0' encoding='UTF-8'?> 
<peci:Workers_Effective_Stack xmlns:peci="urn:com.workday/peci"> 
    <peci:Summary> 
     <peci:Version>1</peci:Version> 
    </peci:Summary> 
    <peci:Worker> 
     <peci:Worker_Summary> 
     </peci:Worker_Summary> 
     <peci:Effective_Change peci:Sequence="0"> 
      <peci:Derived_Event_Code>LOA-C</peci:Derived_Event_Code> 
      <peci:Effective_Moment>2017-03-15T00:00:00.000-07:00</peci:Effective_Moment> 
      <peci:Entry_Moment>2017-03-14T05:42:16.106-07:00</peci:Entry_Moment> 
      <peci:Leave_of_Absence peci:isDeleted="1"> 
       <peci:Leave_Start_Date>2017-03-15-07:00</peci:Leave_Start_Date> 
       <peci:Estimated_Leave_End_Date>2017-04-10-07:00</peci:Estimated_Leave_End_Date> 
       <peci:Leave_Last_Day_of_Work>2017-03-14-07:00</peci:Leave_Last_Day_of_Work> 
       <peci:Leave_of_Absence_Type>X_01</peci:Leave_of_Absence_Type> 
      </peci:Leave_of_Absence> 
      <peci:Leave_of_Absence peci:isAdded="1"> 
       <peci:Leave_Start_Date>2017-03-15-07:00</peci:Leave_Start_Date> 
       <peci:Estimated_Leave_End_Date>2017-04-10-07:00</peci:Estimated_Leave_End_Date> 
       <peci:Leave_Last_Day_of_Work>2017-03-14-07:00</peci:Leave_Last_Day_of_Work> 
       <peci:Leave_of_Absence_Type>X_01</peci:Leave_of_Absence_Type> 
      </peci:Leave_of_Absence> 
     </peci:Effective_Change> 
     <peci:Effective_Change peci:Sequence="1"> 
      <peci:Derived_Event_Code>RFL</peci:Derived_Event_Code> 
      <peci:Effective_Moment>2017-04-13T00:00:00.000-07:00</peci:Effective_Moment> 
      <peci:Entry_Moment>2017-03-14T05:42:16.106-07:00</peci:Entry_Moment> 
      <peci:Leave_of_Absence peci:isUpdated="1"> 
       <peci:Leave_Start_Date>2017-03-15-07:00</peci:Leave_Start_Date> 
       <peci:Leave_End_Date peci:isAdded="1">2017-04-12-07:00</peci:Leave_End_Date> 
       <peci:Estimated_Leave_End_Date>2017-04-10-07:00</peci:Estimated_Leave_End_Date> 
       <peci:First_Day_of_Work peci:isAdded="1">2017-04-13-07:00</peci:First_Day_of_Work> 
       <peci:Leave_Last_Day_of_Work>2017-03-14-07:00</peci:Leave_Last_Day_of_Work> 
       <peci:Leave_of_Absence_Type>X_01</peci:Leave_of_Absence_Type> 
      </peci:Leave_of_Absence> 
     </peci:Effective_Change> 
    </peci:Worker> 
</peci:Workers_Effective_Stack> 

はXSLです:

<?xml version='1.0'?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:this="urn:this-stylesheet" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     xmlns:peci="urn:com.workday/peci" 
     > 

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

    <xsl:template match="peci:Effective_Change">   
     <xsl:if test="peci:Leave_of_Absence"> 
      <xsl:call-template name="TESTID" /> 
     </xsl:if>   
    </xsl:template> 

    <xsl:template name="TESTID">   
     <xsl:apply-templates select="peci:Leave_of_Absence">   
     </xsl:apply-templates> 
    </xsl:template> 

    <xsl:template match="peci:Leave_of_Absence">  
     <Record> 
      <Identification> 
       <xsl:text>TEST</xsl:text> 
      </Identification> 
      <Employee> 
       <xsl:value-of select="../peci:Worker_Summary/peci:Employee_ID" /> 
      </Employee> 
      <Leave_Start_Date> 
       <xsl:value-of select="format-date(peci:Leave_Start_Date, '[D01][M01][Y0001]')" /> 
      </Leave_Start_Date> 
      <Leave_End_Date> 
       <xsl:value-of select="if (exists(peci:Leave_End_Date)) then format-date(peci:Leave_End_Date, '[D01][M01][Y0001]') else format-date(peci:Estimated_Leave_End_Date, '[D01][M01][Y0001]')" /> 
      </Leave_End_Date> 
      <xsl:choose> 
       <xsl:when test="contains(peci:Leave_of_Absence_Type,'_')"> 
        <Absence_Code> 
         <xsl:value-of select="substring-after(peci:Leave_of_Absence_Type,'_')" /> 
        </Absence_Code>      
       </xsl:when> 
       <xsl:otherwise>    
        <Absence_Code> 
         <xsl:value-of select="peci:Leave_of_Absence_Type" /> 
        </Absence_Code>      
       </xsl:otherwise> 
      </xsl:choose>   
      <Duration> 
       <xsl:value-of select="if (exists(peci:Leave_End_Date)) then days-from-duration(xs:date(peci:Leave_End_Date)-xs:date(peci:Leave_Start_Date))+1 else days-from-duration(xs:date(peci:Estimated_Leave_End_Date)-xs:date(peci:Leave_Start_Date))+1" /> 
      </Duration>    
      <xsl:choose> 
       <xsl:when test="./@peci:isAdded or ./@peci:isUpdated"> 
        <Delete_Selection> 
        </Delete_Selection> 
       </xsl:when> 
       <xsl:otherwise> 
        <Delete_Selection> 
         <xsl:text>9</xsl:text> 
        </Delete_Selection> 
       </xsl:otherwise> 
      </xsl:choose>   
     </Record> 
    </xsl:template>  
</xsl:stylesheet> 

は出力:

<?xml version="1.0" encoding="UTF-8"?> 
<File> 
    <Record> 
     <Identification>TEST</Identification> 
     <Employee/> 
     <Leave_Start_Date>15032017</Leave_Start_Date> 
     <Leave_End_Date>10042017</Leave_End_Date> 
     <Absence_Code>01</Absence_Code> 
     <Duration>27</Duration> 
     <Delete_Selection>9</Delete_Selection> 
    </Record> 
    <Record> 
     <Identification>TEST</Identification> 
     <Employee/> 
     <Leave_Start_Date>15032017</Leave_Start_Date> 
     <Leave_End_Date>10042017</Leave_End_Date> 
     <Absence_Code>01</Absence_Code> 
     <Duration>27</Duration> 
     <Delete_Selection/> 
    </Record> 
    <Record> 
     <Identification>TEST</Identification> 
     <Employee/> 
     <Leave_Start_Date>15032017</Leave_Start_Date> 
     <Leave_End_Date>12042017</Leave_End_Date> 
     <Absence_Code>01</Absence_Code> 
     <Duration>29</Duration> 
     <Delete_Selection/> 
    </Record> 
</File> 

私は、現在のテンプレート構造で、以下の出力を得るために探していますフィルター付きの私のxsl。出来ますか? Derived_Event_CodeがLOA-Cの場合、対応するpeci:Leave_of_Absenceを属性peci:isAddedで無視します。現在のxslテンプレート構造のどこにそのフィルタを導入するべきですか?

期待出力:追加する価値

<?xml version="1.0" encoding="UTF-8"?> 
<File> 
    <Record> 
     <Identification>TEST</Identification> 
     <Employee/> 
     <Leave_Start_Date>15032017</Leave_Start_Date> 
     <Leave_End_Date>10042017</Leave_End_Date> 
     <Absence_Code>01</Absence_Code> 
     <Duration>27</Duration> 
     <Delete_Selection>9</Delete_Selection> 
    </Record> 
    <Record> 
     <Identification>TEST</Identification> 
     <Employee/> 
     <Leave_Start_Date>15032017</Leave_Start_Date> 
     <Leave_End_Date>12042017</Leave_End_Date> 
     <Absence_Code>01</Absence_Code> 
     <Duration>29</Duration> 
     <Delete_Selection/> 
    </Record> 
</File> 
+0

特定の ' '要素を省略したいので、そのロジックの場所は、それらの要素を作成するテンプレート、つまり' peci:Leave_of_Absence'と一致する要素です。そのマッチ式に述語を追加して、出力に反映させたい入力要素だけを受け入れるようにする必要があります。 –

答えて

0

ことの一つは、stylesheetタグでxpath-default-namespace="urn:com.workday/peci" です。 XSLTを簡素化することができます。 をpeci:にする必要はありません(属性を除く)。

あなたはうちいくつかの要素をフィルタリングする必要がある場合は、興味深い 代替は、これらの要素、例えばためのテンプレート ( notningん)を、空を書くことです:

<xsl:template match="Leave_of_Absence[@peci:isAdded and ../Derived_Event_Code = 'LOA-C']"/> 

この例では、 Leave_of_Absence要素 を指定した場合と同様に、isAdded属性とDerived_Event_Code近隣のLOA-Cの値を除きます。

ところで:Summary要素の空のテンプレートも追加してください。

<xsl:template match="Summary"/> 

そうでない場合、その含有量(1)が最初Recordの前に現れます。

関連する問題