Перехват текста между инструкциями по обработке в XSLT - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь запустить XSLT на приведенном ниже XML, чтобы обернуть текст между определенными PI с новым элементом:

Ввод XML:

<doc>
   <p>
      <?addition?>hello<?addition?> text1
   </p>
   <p>text2</p>
   <p>
      <?addition?>bye<?addition?> text2
   </p>
</doc>

Я пытается обернуть текст между addition-start и addition-end в элементе <u>, как показано ниже.

Желаемый вывод:

<doc>
   <p>
      <u>hello</u> text1
   </p>
   <p>text2</p>
   <p>
      <u>bye</u> text2
   </p>
</doc>

Мой текущий XSLT неправильно захватывает текстовые узлы, которые не являются промежуточными элементами PI, текущая таблица стилей:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    exclude-result-prefixes="#all"
    version="2.0">
    <xsl:template
        match="@* | node()">
        <xsl:copy
            copy-namespaces="no"
            exclude-result-prefixes="#all"
            inherit-namespaces="no">
            <xsl:apply-templates
                select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="//p/text()[preceding::processing-instruction('addition')]
                                   [following::processing-instruction('addition')]">
        <u><xsl:value-of select="." /></u>
    </xsl:template>
</xsl:stylesheet>

Есть ли способ настроить мой XSLT для достижения этой цели и обернуть только текст, окруженный PI, <u>?

1 Ответ

3 голосов
/ 24 марта 2020

Я думаю, что вы хотите

<xsl:template match="p/text()[preceding-sibling::node()[1][self::processing-instruction('addition')]]
                             [following-sibling::node()[1][self::processing-instruction('addition')]]">
    <u><xsl:value-of select="." /></u>
</xsl:template>

https://xsltfiddle.liberty-development.net/ehVZvvF

И, как отметил Даниэль Хейли в своем комментарии, вы также можете добавить пустой шаблон <xsl:template match="processing-instruction('addition')"/> для удаления инструкций по обработке.

https://xsltfiddle.liberty-development.net/ehVZvvF/1

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