2012-04-11 68 views
2

我在使用XSL將XML顯示格式化爲HTML時遇到問題。XML/XSLT轉換邏輯/如果聲明/隱藏某些行

我有下面的XML:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<Send_Email> 
<Send_Email_lookupID>HIDE_REJECT</Send_Email_lookupID> 
<Error_Message>REJECT1</Error_Message> 
<Error_Message>REJECT2</Error_Message> 
<Error_Message>REJECT3</Error_Message> 
</Send_Email> 

而且XSL:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
<html> 
<body> 
<h2>Result</h2> 
<table border="1"> 
<xsl:for-each select="/Send_Email"> 
<xsl:if test="not(/Send_Email_lookupID)"> 
<tr> 
<td><xsl:value-of select="*"/></td> 
</tr> 
</xsl:if> 
</xsl:for-each> 
</table> 
</body> 
</html> 
</xsl:template> 
</xsl:stylesheet> 

這行總是靜態的,應該被隱藏:

<Send_Email_lookupID>HIDE_REJECT</Send_Email_lookupID> 

下一組線可能每次都會有所不同,但都需要顯示。

任何人都可以幫助我嗎?

在此先感謝。


更新 - 正確的解決方案

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
<html> 
<body> 
<h2>Result</h2> 
<table border="1"> 
<xsl:for-each select="Send_Email/*[local-name()!='Send_Email_lookupID']"> 
<tr> 
<td><xsl:value-of select="."/></td> 
</tr> 
</xsl:for-each> 
</table> 
</body> 
</html> 
</xsl:template> 
</xsl:stylesheet> 

回答

2

我認爲你要與每一行對應一個錯誤信息表 - 比你正在尋找的是:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/"> 
    <html> 
     <body> 
     <h2>Result</h2> 
     <table border="1"> 
      <xsl:for-each select="Send_Email/Error_Message"> 
      <tr> 
       <td><xsl:value-of select="."/></td> 
      </tr> 
      </xsl:for-each> 
     </table> 
     </body> 
    </html> 
    </xsl:template> 

</xsl:stylesheet> 

/Send_Email_lookupID比賽一個根元素,因爲它以/開頭 - 但在您的XML中,具有該名稱的元素不是根元素。

如果你不想只是Error_Message但除了Send_Email_lookupID使用Send_Email下的每一個元素匹配:

  <xsl:for-each select="Send_Email/*[local-name()!='Send_Email_lookupID']"> 

,這意味着「所有除了那些名爲Send_Email_lookupIDSend_Email下的元素。

還要注意,<xsl:value-of select="*"/>輸出包含在當前節點的所有子元素內的文本 - 而<xsl:value-of select="."/>輸出當前節點中包含的文本 - 這就是我們在這種情況下想要的。

+0

如果要根據節點的值隱藏,請使用>。 – Nat 2012-04-11 21:46:12

+0

它仍然爲我返回null。我將在原始問題中發佈新的XSLT。 – gp80586 2012-04-11 22:04:03

+0

對不起 - 錯字 - 應該是'select =「。」' - 我修復了我的答案 – MiMo 2012-04-11 22:20:26