我想选择两个特定单词之间的空格,并在其中放置一些标签。我正在使用XSLT 2.0
<chapter>
<p type="Entry"><doc refType="anchor">
<t/>Command K (ever publish)<t/></doc><ref format="Page Number" refType="anchor" refId="sec-sec_G"/>80
</p>
</chapter>
预期输出:
<chapter>
<p type="Entry"><doc refType="anchor">
<t/>Command K<t/>(ever publish)<t/></doc><ref format="Page Number" refType="anchor" refId="sec-sec_G"/>80
</p>
</chapter>
我的预期输出是将<t/>
标记放在(ever publish)
和Command K
字符串之间。 (ever publish)
和Command
是常量。字符K
可以更改。
尝试的代码:
<chapter match="[starts-with('command')]//text()[ends-with('(ever publish)')]/text()">
<t/>
</chapter>
尝试的代码不起作用。
答案 0 :(得分:1)
从身份模板开始。由于模板优先级详细信息, 应该将其放置在第二个模板之前(请参见下文)。
然后您的脚本应包含与 text()节点匹配的模板,包括 xsl:analyze-string 。 regex 属性应同时包含两个“需要的”字符串以进行捕获 组之间有一个空格。
里面应该是:
请注意,第二个“想要的”字符串包含括号,它们是
特殊的正则表达式字符,因此要按字面意义对待它们,应将其转义
e.g. MyCode~
。
因此整个脚本如下所示:
\
请注意,我添加了<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:analyze-string select="." regex="(Command K) (\(ever publish\))">
<xsl:matching-substring>
<xsl:value-of select="regex-group(1)"/>
<t/>
<xsl:value-of select="regex-group(2)"/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
</xsl:stylesheet>
进行过滤
不必要的空间。