Обработать элемент в любом месте документа xml с помощью xslt - PullRequest
0 голосов
/ 02 июня 2018

У меня есть файл xml, который в основном представляет собой данные статьи.Я хочу преобразовать его, используя xslt.

Мой вопрос: как мне обработать элемент через xslt где угодно, на любой глубине в документе xml?

Мои исследования привели меня к поиску шаблона идентификации, но моя попытка использовать его оказалась безрезультатной.Вот кое-что, что я попробовал:

<xsl:template match="@*|node()">
<xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="em">
blabla
</xsl:template>

Но он не заменил содержимое em на blabla.

Я также обнаружил, что проверка элемента в любом месте - это не то, что можно сделатьсо схемой xsd.Но я надеюсь, что ответ будет другим для xslt.

Минимальный рабочий пример:

<?xml version="1.0"?>
<doc>
    <foo>text <em>italics</em> anything</foo>
    <tag>text <foo><em>italics</em> stuff</foo></tag>
</doc>

Я бы хотел, например, заменить <em>foo</em> на <it>foo</it> или \emph{foo}(конечно, делая другие преобразования в документе).

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Ваш XSLT уже работает в соответствии с запросом.

Вот полный пример, который заменяет em на it:

XML в

<?xml version="1.0"?>
<doc>
    <foo>text <em>italics</em> anything</foo>
    <tag>text <foo><em>italics</em> stuff</foo></tag>
</doc>

XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="em">
    <it>
      <xsl:apply-templates select="@*|node()"/>
    </it>
  </xsl:template>

</xsl:stylesheet>

XML out

<?xml version="1.0" encoding="UTF-8"?>
<doc>
    <foo>text <it>italics</it> anything</foo>
    <tag>text <foo>
         <it>italics</it> stuff</foo>
   </tag>
</doc>
0 голосов
/ 02 июня 2018

Вы не объяснили, в каком отношении решение, которое вы пробовали, было не тем, что вы хотели, но, похоже, у вас правильная идея.Вы можете изменить шаблон идентификатора, удалив оператор <copy>, и тогда он будет просто перебирать все элементы в глубину, сопоставляя любой желаемый элемент с вашим конкретным шаблоном.Если это не то, что вы хотите, пожалуйста, уточните свой вопрос.

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