2014-03-14 46 views
1

情況我有以下問題。我需要知道一個條件是否滿足任何x個同名子節點中的任何一個,並且不處理該行。我正在解析一個xml到一個文本文件,但它可能有2個或3個相同的子節點被稱爲相同的不同的值,如果其中一個滿足條件,然後處理該行。XSL模板匹配,然後如果下面的同輩

這裏是我的XML的一部分:

<home> 
    <app> 
     <data> 
      <rec> 
       <rpos>1</rpos> 
       <itemdef> 
        <item>HLK-TEST-A</item> 
        <desc>SOMETHING1</desc> 
        <ics> 
         <code>HKU</code> 
         <bpid></bpid> 
         <citem>TEST-A</citem> 
        </ics> 
        <ics> 
         <code>HLK</code> 
         <bpid></bpid> 
         <citem>TEST-A</citem> 
        </ics> 
       </itemdef> 
      </rec> 
      <rec> 
       <rpos>2</rpos> 
       <itemdef> 
        <item>HLK-TEST-B</item> 
        <desc>Test</desc> 
        <ics> 
         <code>HKU</code> 
         <bpid></bpid> 
         <citem>TEST-B</citem> 
        </ics> 
       </itemdef> 
      </rec> 
      <rec> 
       <rpos>3</rpos> 
       <itemdef> 
        <item>HLK-TEST-C</item> 
        <desc>Test3</desc> 
        <ics> 
         <code>HLK</code> 
         <bpid></bpid> 
         <citem>TEST-C</citem> 
        </ics> 
       </itemdef> 
      </rec> 
      <rec> 
       <rpos>4</rpos> 
       <itemdef> 
        <item>HLK-TEST-D</item> 
        <desc>SOMETHING4</desc> 
        <ics> 
         <code>HLK</code> 
         <bpid></bpid> 
         <citem>TEST-D</citem> 
        </ics> 
        <ics> 
         <code>HKU</code> 
         <bpid></bpid> 
         <citem>TEST-D</citem> 
        </ics> 
       </itemdef> 
      </rec> 
     </data> 
    </app> 
</home> 

基本上記錄1,3和4必須處理,因爲他們有一個「代碼」標籤與HLK

的價值

這裏就是我對我的XSLT ...儘管我可以設法獲得唯一的記錄1和3 ...你能幫忙嗎?

XSL:

<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 


<xsl:template match="home/app/data/rec[itemdef/ics[position() = last()]/code[not(starts-with(.,'HLK'))]]"> 
</xsl:template> 

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

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

     <xsl:template match="app" mode="print"> 
      <xsl:text>105604|</xsl:text> 
      <xsl:value-of select='date'/> 
      <xsl:text>T</xsl:text> 
      <xsl:value-of select='time'/> 
      <xsl:text>|</xsl:text> 
     </xsl:template> 

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

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

        <xsl:template match="itemdef"> 
         <xsl:apply-templates select="ancestor::app" mode="print"/> 
         <xsl:value-of select='item'/><xsl:text>|</xsl:text> 
         <xsl:value-of select='desc'/><xsl:text>|</xsl:text> 
           <xsl:text>|</xsl:text> 
           <xsl:text>|&#xD;&#xA;</xsl:text> 
        </xsl:template> 
</xsl:stylesheet> 

這是我的電流輸出:

105604|T|HLK-TEST-A|SOMETHING1||| 
105604|T|HLK-TEST-C|Test3||| 

但應該是:

105604|T|HLK-TEST-A|SOMETHING1||| 
105604|T|HLK-TEST-C|Test3||| 
105604|T|HLK-TEST-D|SOMETHING4||| 

回答

1

第四rec元素被過濾掉,因爲空模板匹配rec元素誰是最後的ics元素不以「HLK」開頭。在您的XML中,第4個rec元素的最後一個ics元素的值爲「HKU」,該值不以「HLK」開頭。

從它看起來像你的標準爲空的模板應該是匹配不具有itemdef/ics/code以「HLK」開始rec元素,無論ics元素的position()的示例XML:

<xsl:template match="rec[not(itemdef/ics/code[starts-with(.,'HLK')])]" /> 

或者,您可以在rec元素上匹配空模板,另一個元素匹配具有「HLK」code元素的rec元素。

<xsl:template match="rec" /> 

<xsl:template match="rec[itemdef/ics/code[starts-with(.,'HLK')]]"> 
    <xsl:apply-templates select="itemdef"/> 
</xsl:template> 
+0

太感謝你了!你的第一個建議做到了!我在這工作了2天,並沒有意識到我需要相反的:)謝謝你Mads! – marshal82