XSL 在特定字符上拆分字符串并应用处理(来自 DITA Open Toolkit Processing 的示例)

XSL split string on specific characters and apply processing (Example From DITA Open Toolkit Processing)

我的 XSL 中已经有这条规则:

  <xsl:template match="title[starts-with(.,'Key Information for')]">
    <xsl:copy>
      <xsl:attribute name="outputclass">Key Information Long</xsl:attribute>
      <xsl:apply-templates select="@*  | node()"/>
    </xsl:copy>
  </xsl:template>  

它的作用:在 DITA Open Toolkit pre-processing 期间将 outputclass='Key Information' 添加到以 "Key Information for" 开头的 title 标签。

我需要做的是将 XPath 添加到匹配规则中,以找到符合此模式的其他标题:

<title>Some title text (More title text)</title>

我的 xsl xpath 需要识别以括号中包含的文本结尾的标题并添加一些新标记 (<ph aid:cstyle="parenthetical-subtitle">(More title text)</ph> 到该标题。当我添加此规则时,我还需要知道如何与现有规则集成,以便它也得到额外的处理(并避免歧义冲突:现有规则和新规则都可以应用于同一内容实例)。

我正在想象使用 ends-with() 函数进行涉及 choose/when 逻辑的编辑,但我在确切的操作方法上碰壁了,结果发现我正在使用的工具包版本仅支持 xml 1.0。举例说明--

如果我有这个输入 xml:

<section>
<title>Key Information for Our Test Process</title>
<p>Some stupid content.</p>
</section>
<section>
<title>Some Other Title</title>
<p>Other content.</p>
</section>
<section>
<title>Key Information for Testing (Stupid People Only)</title>
<p>Parentheses identify an audience which could really be anything.</p>
</section>

我希望对我的规则进行编辑以生成此输出:

<section>
<title outputclass="Key Information Long">Key Information for Our Test Process</title>
<p>Some stupid content.</p>
</section>
<section>
<title>Some Other Title</title>
<p>Other content.</p>
</section>
<section>
<title outputclass="Key Information Long">Key Information for Testing <ph aid:cstyle="parenthetical-subtitle">(Stupid People Only)</ph></title>
<p>Parentheses identify an audience which could really be anything.</p>
</section>

如果我们可以假设 title 元素没有元素子元素而只有纯文本,并且您有一个 XSLT 2 或 3 处理器,因为提到 ends-with 建议您可以匹配中的文本节点元素并用 xsl:analyze-string:

处理它
  <xsl:template match="title[starts-with(.,'Key Information for')]">
    <xsl:copy>
      <xsl:attribute name="outputclass">Key Information Long</xsl:attribute>
      <xsl:apply-templates select="@*  | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="title[starts-with(.,'Key Information for')]/text()">
      <xsl:analyze-string select="." regex="\(.*\)$">
          <xsl:matching-substring>
              <ph aid:cstyle="parenthetical-subtitle">
                  <xsl:value-of select="."/>
              </ph>
          </xsl:matching-substring>
          <xsl:non-matching-substring>
              <xsl:value-of select="."/>
          </xsl:non-matching-substring>
      </xsl:analyze-string>
  </xsl:template>

https://xsltfiddle.liberty-development.net/6pS2B6n

您可以使用以下条件识别以括号中的文本结尾的 title(尽管不一定是平衡的括号):

contains(., '(') and substring(., string-length(.))=')'

您可以在单独的模板中将其用作谓词,并赋予它与现有模板不同的优先级。