2014-04-16 47 views
2

使用for循環我有以下格式的XML:在XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<response> 
    <cases> 
     <case>CASE-ONE</case> 
     <case>CASE-TWO</case> 
    </cases> 
    <results> 
     <Final-Results> 
     <issues> 
      <row> 
       <IKEY>2014-03-26-05.22.22.193840T01</IKEY> 
       <PRTY>999</PRTY> 
      </row> 
     </issues> 
     </Final-Results> 
     <Final-Results> 
     <issues> 
      <row> 
       <IKEY>2014-03-26-05.05.51.077840T01</IKEY> 
       <PRTY>999</PRTY> 
      </row> 
      <row> 
       <IKEY>2014-03-26-05.10.51.077840T01</IKEY> 
       <PRTY>999</PRTY> 
      </row> 
     </issues> 
     </Final-Results> 
    </results> 
</response> 

現在,我想用XSLT上述XML轉換爲以下格式:

<?xml version="1.0" encoding="UTF-8"?> 
<response> 
    <cases> 
     <case> 
     CASE-ONE 
     <issues> 
      <row> 
       <IKEY>2014-03-26-05.22.22.193840T01</IKEY> 
       <PRTY>999</PRTY> 
      </row> 
     </issues> 
     </case> 
     <case> 
     CASE-TWO 
     <issues> 
      <row> 
       <IKEY>2014-03-26-05.05.51.077840T01</IKEY> 
       <PRTY>999</PRTY> 
      </row> 
      <row> 
       <IKEY>2014-03-26-05.10.51.077840T01</IKEY> 
       <PRTY>999</PRTY> 
      </row> 
     </issues> 
     </case> 
    </cases> 
</response> 

的想法是將第一個<issues> </issues>標籤到第一個<case> </case>標籤和第二個<issues> </issues>標籤之間的內容移動到第二個標籤之間等等。這裏的<case>標籤和<issues>標籤的數量是不確定的。所以,我認爲我必須在這裏使用循環類的東西。老實說,我不擅長使用XSLT。如果你能提供解決方案,那將是非常好的。如果我的問題不清楚,請隨時添加評論,以便我可以用更好的單詞表達。 在此先感謝。

+0

如果你有超過你的輸出文檔我建議不要使用混合內容類似的設計控制這個' CASE-ONE ...'你應該換的情況名在名稱標籤中,例如' CASE-ONE ...'或其他類似的語義符合您的需求。 –

回答

3

無需使用for循環。改爲使用identity transformxsl:apply-templates

XML輸入

<response> 
    <cases> 
     <case>CASE-ONE</case> 
     <case>CASE-TWO</case> 
    </cases> 
    <results> 
     <Final-Results> 
      <issues> 
       <row> 
        <IKEY>2014-03-26-05.22.22.193840T01</IKEY> 
        <PRTY>999</PRTY> 
       </row> 
      </issues> 
     </Final-Results> 
     <Final-Results> 
      <issues> 
       <row> 
        <IKEY>2014-03-26-05.05.51.077840T01</IKEY> 
        <PRTY>999</PRTY> 
       </row> 
       <row> 
        <IKEY>2014-03-26-05.10.51.077840T01</IKEY> 
        <PRTY>999</PRTY> 
       </row> 
      </issues> 
     </Final-Results> 
    </results> 
</response> 

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/*"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|cases"/> 
     </xsl:copy>   
    </xsl:template> 

    <xsl:template match="case"> 
     <xsl:variable name="pos" select="position()"/> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
      <xsl:apply-templates select="/*/results/Final-Results[position()=$pos]/issues"/> 
     </xsl:copy>   
    </xsl:template> 

</xsl:stylesheet> 

XML輸出

<response> 
    <cases> 
     <case>CASE-ONE<issues> 
      <row> 
       <IKEY>2014-03-26-05.22.22.193840T01</IKEY> 
       <PRTY>999</PRTY> 
      </row> 
     </issues> 
     </case> 
     <case>CASE-TWO<issues> 
      <row> 
       <IKEY>2014-03-26-05.05.51.077840T01</IKEY> 
       <PRTY>999</PRTY> 
      </row> 
      <row> 
       <IKEY>2014-03-26-05.10.51.077840T01</IKEY> 
       <PRTY>999</PRTY> 
      </row> 
     </issues> 
     </case> 
    </cases> 
</response> 
1

我能想到的是這樣的:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

<xsl:output indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <response> 
     <cases> 
      <xsl:apply-templates select="response/cases/case"/> 
     </cases> 
    </response> 
</xsl:template> 
<xsl:template match="cases/case"> 
    <xsl:variable name="pos" select="position()"/> 
    <xsl:copy> 
     <xsl:value-of select="."/> 
     <xsl:copy-of select="//response/results/Final-Results[position() = $pos]/issues"/> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 
1

以下styleshee牛逼產生期望的結果:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes" /> 
    <xsl:strip-space elements="*" /> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="case"> 
     <case> 
      <xsl:value-of select="concat('&#xa;', ., '&#xa;')" /> 
      <xsl:copy-of 
       select="../../results/Final-Results[ 
      count(current()/preceding-sibling::case) + 1]/issues" /> 
     </case> 
    </xsl:template> 
    <xsl:template match="results" /> 
</xsl:stylesheet>