我正在基于xslt的转换中工作。我需要将一个元素中的单词替换为完全匹配的另一个元素。但目前它也部分匹配。
我的输入是
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<doc>
<section>
<key>SERVICE</key>
<title>ABOUT SERVICES (OUR SERVICE) OF THE CONCERN(SERVICE)</title>
</section>
<section>
<key>SERVICES</key>
<title>ABOUT NEW SERVICES, TO DO CONCERN(SERVICE)</title>
</section>
<section>
<key>LOOK</key>
<title>IT LOOKING SO, BUT "LOOK" GOOD</title>
</section>
</doc>
我需要在标题元素中找到关键字word,然后用<b>关键字</ b>替换。比赛应该是准确的。
但目前,它也替换了所有部分匹配,如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<doc>
<section>
<key>SERVICE</key>
ABOUT <b>SERVICE</b>S (OUR <b>SERVICE</b>) OF THE CONCERN(<b>SERVICE</b>)
</section>
<section>
<key>SERVICES</key>
ABOUT NEW <b>SERVICES</b>, TO DO CONCERN(SERVICE)
</section>
<section>
<key>LOOK</key>
IT <b>LOOK</b>ING SO, BUT "<b>LOOK</b>" GOOD
</section>
</doc>
我的xslt是
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="title">
<xsl:variable name="k-word-text">
<xsl:text><b></xsl:text>
<xsl:value-of select="preceding-sibling::key"/>
<xsl:text></b></xsl:text>
</xsl:variable>
<xsl:choose>
<xsl:when test="matches(., preceding-sibling::key)">
<xsl:value-of select="replace(., preceding-sibling::key, $k-word-text)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
低于我的预期输出
<?xml version="1.0" encoding="UTF-8"?>
<doc>
<section>
<key>SERVICE</key>
ABOUT SERVICES (OUR <b>SERVICE</b>) OF THE CONCERN(<b>SERVICE</b>)
</section>
<section>
<key>SERVICES</key>
ABOUT NEW <b>SERVICES</b>, TO DO CONCERN(SERVICE)
</section>
<section>
<key>LOOK</key>
IT LOOKING SO, BUT "<b>LOOK</b>" GOOD
</section>
</doc>
一种解决方案是创建一个变量来保存您要匹配的文本,但要包含正则表达式以确保该键不在字母之前或之后
<xsl:variable name="k-match-text">
<xsl:text>(^|[^A-Za-z])</xsl:text>
<xsl:value-of select="preceding-sibling::key"/>
<xsl:text>($|[^A-Za-z])</xsl:text>
</xsl:variable>
请注意,这里实际上不需要xsl:choose
with contains
,就好像文本不包含键一样,该replace
语句将使文本保持不变。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="title">
<xsl:variable name="k-word-text">
<xsl:text>$1<b></xsl:text>
<xsl:value-of select="preceding-sibling::key"/>
<xsl:text></b>$2</xsl:text>
</xsl:variable>
<xsl:variable name="k-match-text">
<xsl:text>(^|[^A-Za-z])</xsl:text>
<xsl:value-of select="preceding-sibling::key"/>
<xsl:text>($|[^A-Za-z])</xsl:text>
</xsl:variable>
<xsl:value-of select="replace(., $k-match-text, $k-word-text)"/>
</xsl:template>
</xsl:stylesheet>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句