Сравните значения узлов xml в xsl и выделите различия - PullRequest
0 голосов
/ 24 мая 2018

У меня есть XML.Я преобразую его с помощью таблицы стилей XSL и показывая на странице HTML, используя Java.Мое требование заключается в том, что мне нужно сравнить два значения узла, и если есть разница, мне нужно выделить измененное значение символа.Как это может быть сделано ?

XML:

<?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>

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>

Как сравнить значения узлов res1 с res2?В моем случае значение «VI70002 ID» следует сравнивать с «VI7002 DD», и, поскольку есть изменение, я должен выделить символ «D» на html-странице, используя xsl.Может ли кто-нибудь помочь в этом вопросе.

1 Ответ

0 голосов
/ 24 мая 2018

Если вы используете только XSLT-1.0, вы можете использовать рекурсивный именованный шаблон для перебора строки char-by-char: следующий шаблон принимает в качестве входных данных две строки и делает акцент на полужирный каждый другой символЕсли вторая строка длиннее первой, эти конечные символы также подсвечиваются.

<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>

Вызовите этот шаблон из одного из других шаблонов, чтобы получить (частично) подсвеченную «строку», например

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...