将标签放置在xslt中两个常量词之间的空格中

时间:2019-06-25 05:33:00

标签: xslt

我想选择两个特定单词之间的空格,并在其中放置一些标签。我正在使用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>

尝试的代码不起作用。

1 个答案:

答案 0 :(得分:1)

身份模板开始。由于模板优先级详细信息, 应该将其放置在第二个模板之前(请参见下文)。

然后您的脚本应包含与 text()节点匹配的模板,包括 xsl:analyze-string regex 属性应同时包含两个“需要的”字符串以进行捕获 组之间有一个空格。

里面应该是:

  • xsl:matching-substring 打印:
    • 第1组(使用正则表达式捕获)
    • 元素(或此处想要的任何内容)
    • 第2组。
  • xsl:non-matching-substring ,只是复制不匹配的文本。

请注意,第二个“想要的”字符串包含括号,它们是 特殊的正​​则表达式字符,因此要按字面意义对待它们,应将其转义 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> 进行过滤 不必要的空间。