2011-05-03 250 views
0
<command>abc</command> 
<Pset name="X_number"> 
<var name="Y_name">A</var> 
<var name="Y_num">6</var> 
<var name="Z_name">C</var> 
</Pset> 
<Pset name="T_num"> 
<var name="T_num">1</var> 
</Pset> 
<Pset name="T_num"> 
<var name="T_num">2</var> 
</Pset> 
<Pset name="T_status"> 
<var name="T_status">U</var> 
</Pset> 
<Pset name="T_status"> 
<var name="T_status">V</var> 
</Pset> 
<Pset name="end_matching"> 
</Pset> 

<Pset name="X_number"> 

我們得以下結構出來的:選擇節點

 <Event> 

     <module_num>A</module_num> <here module_num corrosponds to <var name="Y_name">A</var> and display value of Y_name) 

     <Tnumber>1</Tnumber> (here TNumber(you can give any name, I kept Tnumber to keep it simple) corresponds to first Pset of T_Num and get the value from <var name="T_num">1</var>) 
<Tstatus>U</Tstatus> (here Tstatus corresponds to first Pset of T_status and get the value from <var name="T_Status">U</var>)   
     </Event> 

    <Event> 

    <module_num>A</module_num> <here module_num is same as first Event set> 

    Tnum>2</Tnum> (Here also it is second one , and there can be multiple) 
    <Tstatus>V</Tstatus> 
    </Event> 

Module_num將reamin共同從X_number和Tstatus和Tnum起源將是相關的所有活動根據它們的位置,我們必須在另一個X_number開始之前迭代所有的T_num/T_status。

回答

0

這個樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="kPsetByPrecX_number" 
      match="Pset[@name[.='T_num' or .='T_status']]" 
      use="generate-id(preceding-sibling::Pset[@name='X_number'][1])"/> 
    <xsl:template match="t"> 
     <xsl:copy> 
      <xsl:apply-templates select="Pset[@name='X_number']"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Pset[@name='X_number']"> 
     <xsl:variable name="vCurrent-group" 
         select="key('kPsetByPrecX_number',generate-id())"/> 
     <xsl:apply-templates select="$vCurrent-group[@name='T_num']"> 
      <xsl:with-param name="pModule" select="var[@name='Y_name']"/> 
      <xsl:with-param name="pStatus" 
          select="$vCurrent-group[@name='T_status']"/> 
     </xsl:apply-templates> 
    </xsl:template> 
    <xsl:template match="Pset[@name='T_num']"> 
     <xsl:param name="pModule"/> 
     <xsl:param name="pStatus" select="/.."/> 
     <xsl:variable name="vPosition" select="position()"/> 
     <Event> 
      <module_num> 
       <xsl:value-of select="$pModule"/> 
      </module_num> 
      <xsl:apply-templates select="(.|$pStatus[$vPosition])/var"/> 
     </Event> 
    </xsl:template> 
    <xsl:template match="var"> 
     <xsl:element name="{translate(@name,'_','')}"> 
      <xsl:value-of select="."/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

有了這個輸入:

<t> 
    <command>abc</command> 
    <Pset name="X_number"> 
     <var name="Y_name">A</var> 
     <var name="Y_num">6</var> 
     <var name="Z_name">C</var> 
    </Pset> 
    <Pset name="T_num"> 
     <var name="T_num">1</var> 
    </Pset> 
    <Pset name="T_num"> 
     <var name="T_num">2</var> 
    </Pset> 
    <Pset name="T_status"> 
     <var name="T_status">U</var> 
    </Pset> 
    <Pset name="T_status"> 
     <var name="T_status">V</var> 
    </Pset> 
    <Pset name="end_matching"></Pset> 
    <Pset name="X_number"/> 
</t> 

輸出:

<t> 
    <Event> 
     <module_num>A</module_num> 
     <Tnum>1</Tnum> 
     <Tstatus>U</Tstatus> 
    </Event> 
    <Event> 
     <module_num>A</module_num> 
     <Tnum>2</Tnum> 
     <Tstatus>V</Tstatus> 
    </Event> 
</t> 
+0

@Alejandro:我會努力'的'那麼你不需要kStatusByNumber和vNumber;你怎麼看? – mousio 2011-05-03 21:41:06

+0

@mousio:這將依賴於每個'Pset [@ name ='T_num']'的一個'Pset [@ name ='T_status']'的存在,因爲否則不使用'Pset [@ name ='X_number']]作爲錨點可能會導致錯誤的輸出。除此之外,這也是一個很好的解決方案。 – 2011-05-03 22:22:50

+0

Alejandro/Mousio:感謝您關注此事,我會根據我的要求對其進行探討,以便在遇到任何問題時我會回覆您。 – Xslguy 2011-05-04 14:36:25