Xslt 比较xsl中的xml节点值并突出显示差异
我有一个xml。我正在使用xsl样式表转换它,并使用java在html页面中显示它。我的要求是,我需要比较两个节点值,如果有差异,我需要突出显示更改的字符值。如何做到这一点 XML:Xslt 比较xsl中的xml节点值并突出显示差异,xslt,Xslt,我有一个xml。我正在使用xsl样式表转换它,并使用java在html页面中显示它。我的要求是,我需要比较两个节点值,如果有差异,我需要突出显示更改的字符值。如何做到这一点 XML: <?xml version="1.0" encoding="UTF-8" standalone="no"?> <Message> <DiffDetailMessage> <TestCaseID>000001</TestCaseID>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Message>
<DiffDetailMessage>
<TestCaseID>000001</TestCaseID>
<res1>VI7002 1D</res1>
<res2>VI7002 DD </res2>
</DiffDetailMessage>
<DiffDetailMessage>
<TestCaseID>000002</TestCaseID>
<res1>BS7002 1D</res1>
<res2>BS7002 SS </res2>
</DiffDetailMessage>
</Message>
000001
VI7002 1D
VI7002 DD
000002
BS7002 1D
BS7002不锈钢
XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Report</h2>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="Message/DiffDetailMessage">
<table border="2">
<xsl:apply-templates select="TestCaseID"/>
<xsl:apply-templates select="res1"/>
<xsl:apply-templates select="res2"/>
</table>
</xsl:template>
<xsl:template match="TestCaseID">
<tr><td><b>Test CaseID </b></td>
<td><xsl:value-of select="."/></td></tr>
</xsl:template>
<xsl:template match="res1">
<tr><td><b>Res1</b></td>
<td><xsl:value-of select="."/> </td> </tr>
</xsl:template>
<xsl:template match="res2">
<tr><td><b>Res2</b></td>
<td><xsl:value-of select="."/></td> </tr>
</xsl:template>
</xsl:stylesheet>
报告
测试用例ID
Res1
Res2
如何比较节点值res1和res2?在我的例子中,应该将“VI70002 ID”的值与“VI7002 DD”进行比较,因为有变化,所以我应该使用xsl在html页面中突出显示“D”字符。有人可以在这方面提供帮助。如果您只使用XSLT-1.0,可以使用递归命名模板逐字符迭代字符串:以下模板将两个字符串作为输入,并在每个不同的字符上加粗体强调。如果第二个字符串比第一个字符串长,这些尾随字符也会高亮显示
<xsl:template name="cmp">
<xsl:param name="str1" />
<xsl:param name="str2" />
<xsl:choose>
<xsl:when test="substring($str1,1,1) = substring($str2,1,1)">
<xsl:value-of select="substring($str2,1,1)"/>
</xsl:when>
<xsl:when test="substring($str1,1,1) != substring($str2,1,1)">
<b><xsl:value-of select="substring($str2,1,1)"/></b>
</xsl:when>
<xsl:when test="$str1 = '' and substring($str2,1,1)">
<b><xsl:value-of select="substring($str2,1,1)"/></b>
</xsl:when>
</xsl:choose>
<xsl:if test="string-length($str1) > 0 or string-length($str2) > 0">
<xsl:call-template name="cmp">
<xsl:with-param name="str1" select="substring($str1,2)" />
<xsl:with-param name="str2" select="substring($str2,2)" />
</xsl:call-template>
</xsl:if>
</xsl:template>
从其他模板之一调用此模板以获得(部分)高亮显示的“字符串”,例如
Res2
您能使用XSLT2吗?我很高兴XSLT2具有比XSLT1容易得多的功能。这是一个很难做好的问题。考虑购买DelTracML,这是一项专门用于区分XML文档的任务。当然,比较两个字符串是比较两个XML文档的一小部分。
<xsl:template match="res2">
<tr><td><b>Res2</b></td>
<td>
<xsl:call-template name="cmp">
<xsl:with-param name="str1" select="../res1" />
<xsl:with-param name="str2" select="." />
</xsl:call-template>
</td> </tr>
</xsl:template>