Поместите тег в пробел между двумя постоянными словами в xslt - PullRequest
0 голосов
/ 25 июня 2019

Я хочу выбрать пробел между двумя конкретными словами и поместить туда какой-нибудь тег.Я использую 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 Ответ

1 голос
/ 25 июня 2019

Начните с шаблона идентификации .Из-за деталей определения приоритетов шаблона его следует поместить перед вторым шаблоном (см. Ниже).

Тогда ваш скрипт должен содержать шаблон, соответствующий text () узлам, включая xsl:анализировать строка .Атрибут regex должен содержать обе «нужные» строки в качестве групп захвата с пробелом между ними.

Внутри должно быть:

  • xsl: match-подстрока печать:
    • группа 1 (захвачена с помощью регулярного выражения),
    • элемент (или все, что вы хотите здесь),
    • группа 2.
  • xsl: не совпадающая подстрока , просто репликациянесоответствующий текст.

Обратите внимание, что вторая "требуемая" строка содержит круглые скобки, которые являются специальными символами регулярных выражений, поэтому для их обработки буквально их следует экранировать с помощью \.

Таким образом, весь сценарий может выглядеть следующим образом:

<?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>

Обратите внимание, что я добавил <xsl:strip-space elements="*"/> для фильтрации ненужных пробелов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...