我们需要在比较时将括号作为它们环绕的单词的一部分。
例如:
投入A:
嗨(A)
投入B:
嗨(B)
当前产出:
嗨(<Inserted>B<\Inserted> <Deleted>A<\Deleted>)
预期产出:
嗨<Inserted>(B)<\Inserted> <Deleted>(A)<\Deleted>
谢谢!
发布于 2018-08-08 11:09:46
在这个答案中,我假设您使用的是DeltaXML的DocumentComparator类。
这个类的默认行为是允许逐字比较.它通过将文本分割成空格、标点符号或单词元素来做到这一点。
因此,例如,对于输入A,您将得到:
...
<deltaxml:word>Hi</deltaxml:word>
<deltaxml:space>_</deltaxml:space>
<deltaxml:punctuation>(</deltaxml:punctuation>
<deltaxml:word>A</deltaxml:word>
<deltaxml:punctuation>)</deltaxml:punctuation>
...作为比较器的A输入。
为了防止以这种方式分割文本,您需要一个XSLT输入过滤器,它在deltaxml:word元素中包装特定的文本模式,并带有deltaxml:逐字逐句=‘false’属性。以下是一些实现此功能的示例XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:deltaxml="http://www.deltaxml.com/ns/well-formed-delta-v1"
exclude-result-prefixes="#all"
version="2.0">
<xsl:template match="*|comment()|processing-instruction() | @*">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!--
wrap a specific text pattern in text as a word-element
in this case, any non-whitespace characters surrounded by '(' and ')' chars
-->
<xsl:template match="text()">
<xsl:analyze-string select="." regex="(\([^\s]*?\))">
<xsl:matching-substring>
<deltaxml:word deltaxml:word-by-word="false">
<xsl:value-of select="current()"/>
</deltaxml:word>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="current()"/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
</xsl:stylesheet>https://stackoverflow.com/questions/51742790
复制相似问题