xslt - добавление атрибута ко всем соответствующим дочерним элементам xml (без их перемещения) - PullRequest
0 голосов
/ 03 октября 2018

Я использую XSLT для преобразования XML перед его импортом в InDesign.

Некоторые элементы включают в себя текст с несколькими дочерними элементами, которые форматируются курсивом, полужирным шрифтом и т. Д. Чтобы курсив работал в InDesign, я хочудобавить атрибут к этим дочерним элементам.

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

Итак, я хочу взять XML, который выглядит следующим образом:

<copy_block>
    A section of text of an unknown length in which might appear <i>one or more</i> sections 
    of italics <i>which I want to add</i> an attribute to.
</copy_block>

и использовать мою таблицу стилей XSL, чтобы преобразовать его в:

<copy_block>
    A section of text of an unknown length in which might appear <i cstyle="stylename">one or more</i> sections 
    of italics <i cstyle="stylename">which I want to add</i> an attribute to.
</copy_block>

Я неЯ не думаю, что это может быть так сложно, но по какой-то причине я в тупике.Буду очень признателен за любую помощь.

Спасибо!

1 Ответ

0 голосов
/ 03 октября 2018

Начните с шаблона идентификации

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

(В XSLT 3.0 вы можете заменить его просто <xsl:mode on-no-match="shallow-copy"/>)

Это касается копирования всех элементови узлы без изменений.Все, что вам затем нужно сделать, это добавить переопределяющий шаблон, который соответствует i, который добавляет к нему атрибут.

<xsl:template match="i">
  <i cstyle="stylename">
    <xsl:apply-templates />
  </i>
</xsl:template>

Попробуйте этот полный XSLT

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

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

  <xsl:template match="i">
    <i cstyle="stylename">
      <xsl:apply-templates />
    </i>
  </xsl:template>
</xsl:stylesheet>

Смотрите его в действии наhttp://xsltfiddle.liberty -development.net / nc4NzR2

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