我正在使用xslt将xml文档转换为html,以便在电子邮件中使用。我需要将xml元素与另一个xml元素值进行比较,以便我知道给出该值的格式。基本上我有一个xml结构:
<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将项值与'comparer'节点值进行比较,如果它们相等则加粗表格中的单元格,否则单元格值我用鼻子加粗。我需要在不使用javascript的情况下完成此操作,因此必须在xsl中完成。现在,我正在考虑使用xsl:variable然后尝试使用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。我只是想集中讨论我的问题。
答案 0 :(得分: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>
答案 1 :(得分: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>
注意:模式匹配和节点集比较。