2013-05-17 55 views
0

我有一個很長的字符串,我想用xslt顯示。 的XSLT代碼片段是這樣的:如何使用循環裏面的xls

<xsl:template match="report:rmessagewithbutton"> 
    <h2>Running and terminated requests</h2> 
    <table border="1"> 
     <tr> 
      <th>Name</th> 
      <th>Button</th> 
     </tr> 
     <tr> 
      <td> 
       <!-- <xsl:for-each select="rmessagewithbutton"> + --> 
       <message> 
        <xsl:copy-of select="." /> 
       </message> 
       <!-- </xsl:for-each> --> 
      </td> 
      <td> 
       <input type="submit" value="Stop Request" /> 
      </td> 
     </tr> 
    </table> 

我生成通過以下的方法用java的XML:

public static void generateOutputWithButton(final ContentHandler contentHandler, final String msg) throws SAXException{ 
    contentHandler.startElement(REPORT_NS, "rmessagewithbutton", "report:rmessagewithbutton", SAXHelper.NO_ATTR); 
    generateIWithButton(contentHandler, msg); 
    contentHandler.endElement(REPORT_NS, "rmessagewithbutton", "report:rmessagewithbutton");   
} 
public static void generateIWithButton(final ContentHandler contentHandler, final String text) throws SAXException {  
    contentHandler.startElement(I18nTransformer.I18N_NAMESPACE_URI, I18nTransformer.I18N_TEXT_ELEMENT, FormsConstants.I18N_PREFIX_COLON + I18nTransformer.I18N_TEXT_ELEMENT, SAXHelper.NO_ATTR); 
    SAXHelper.toSAX(contentHandler, text); 
    contentHandler.endElement(I18nTransformer.I18N_NAMESPACE_URI, I18nTransformer.I18N_TEXT_ELEMENT, FormsConstants.I18N_PREFIX_COLON + I18nTransformer.I18N_TEXT_ELEMENT); 
} 

即顯示在一塊很長的字符串。如果我希望字符串逐行顯示,那麼我必須在一個循環內調用generateOutputWithButton()方法窗體。 事情是這樣的:

for (String l : StringUtils.split(message, "\n")) { 
ReportGeneratorHelper.generateOutputWithButton(contentHandler, l); 
} 

該解決方案然而具有不必要的副作用。它顯示一切,整個表多次。所以我需要從Java代碼中移除循環,並將其放到xsl中。但我不熟悉的語法,我不知道我應該在哪個迭代.. 任何意見表示讚賞。

+0

任何機會,你可以提供一個樣本(小)源XML文檔和轉換的通緝的結果? –

+0

謝謝我在此期間找到了一個解決方案 –

+0

pr123,我明白了,但我建議使用純粹的XSLT解決方案 - 根本不需要Java代碼。 –

回答

0

解決方案:a for循環可以留在java代碼中,但只應用於子元素。

public static void generateOutputWithButton(final ContentHandler contentHandler, final String msg) throws SAXException{ 

     contentHandler.startElement(REPORT_NS, "rmessagewithbutton", "report:rmessagewithbutton", SAXHelper.NO_ATTR); 
     for (String l : StringUtils.split(msg, "\n")) { 
       contentHandler.startElement(REPORT_NS, "subelement", "report:subelement", SAXHelper.NO_ATTR); 
       generateIWithButton(contentHandler, l); 
       contentHandler.endElement(REPORT_NS, "subelement", "report:subelement");   
     } 
     contentHandler.endElement(REPORT_NS, "rmessagewithbutton", "report:rmessagewithbutton");   
    } 



<xsl:template match="report:rmessagewithbutton"> 
    <h2>Running and terminated requests</h2> 
    <table border="1"> 
     <tr> 
      <th>Name</th> 
      <th>Button</th> 
     </tr> 
     <xsl:apply-templates select="report:subelement"/> 
    </table> 

​​