2010-09-28 35 views
0

我正在使用xslt將xml文檔轉換爲HTML以用於電子郵件中。我需要將xml元素與另一個xml元素值進行比較,以便我知道給出該值的格式。基本上我有一個XML結構,例如:如何比較XML元素與XSL變量

<main> 
    <comparer>1</comparer> 
    <items> 
     <item> 
      <name>blarg</name> 
      <values> 
       <value>1</value> 
       <value>2</value> 
      </values> 
    </items> 
</main> 

品種信息被用來建立一個表:

<table> 
    <tr> 
     <td>blarg</td> 
     <td>1</td> 
     <td>2</td> 
    </tr> 
</table> 

我需要能夠做的是使用XSL來比較項目值與'比較'節點值,如果他們相等,然後加粗表格中的單元格,否則單元格值我鼻子粗體。我需要在不使用JavaScript的情況下完成此操作,因此必須在xsl中完成。現在,我正在查看使用xsl:變量,然後嘗試使用xsl:何時進行比較。不幸的是,我很幸運。這是我剛開始玩爲表中的每一行:

<xsl:variable name="compare" select="//main/comparer" /> 

...  

<xsl:for-each select="value"> 
    <td> 
     <xsl:choose> 
      <xsl:when test=". = $compare"> 
       <b> 
        <xsl:value-of select="."/> 
       </b> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="."/>. 
      </xsl:otherwise> 
     </xsl:choose> 
    </td> 
</xsl:for-each> 

* 注意:我離開了大部分的XSL的贅述。我只是想着重討論我的問題。

回答

1

經過一些試驗和錯誤之後,我想出了它。亞歷杭德羅的回答似乎表明它會起作用,但我沒有奢侈的重構xsl來利用模板。這是我用來解決我的問題:

<xsl:variable name="compare" select="//main/comparer" /> 

...  

<xsl:for-each select="value"> 
    <td> 
     <xsl:choose> 
      <xsl:when test="contains(., $expireDate)"> 
       <b> 
        <xsl:value-of select="."/> 
       </b> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="."/>. 
      </xsl:otherwise> 
     </xsl:choose> 
    </td> 
</xsl:for-each> 
0

該樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="main"> 
     <table> 
      <xsl:apply-templates select="items"/> 
     </table> 
    </xsl:template> 
    <xsl:template match="item"> 
     <tr> 
      <xsl:apply-templates/> 
     </tr> 
    </xsl:template> 
    <xsl:template match="name|value"> 
     <td> 
      <xsl:apply-templates/> 
     </td> 
    </xsl:template> 
    <xsl:template match="value/text()[.=/main/comparer]"> 
     <b> 
      <xsl:value-of select="."/> 
     </b> 
    </xsl:template> 
</xsl:stylesheet> 

輸出:

<table> 
    <tr> 
     <td>blarg</td> 
     <td> 
      <b>1</b> 
     </td> 
     <td>2</td> 
    </tr> 
</table> 

:模式匹配和節點集比較。

+0

有沒有一種方法,我不會重構文檔使用模板?例如: 2010-09-28 22:42:53

+0

@gun_shy:模式匹配**是** XSLT的內容。對於測試,使用節點集合比較:'。 =/main/comparer',就像我在模式謂詞中所做的那樣。 – 2010-09-29 12:44:35