2010-09-28 48 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