XSL: удаление тегов XML, но сохраняя их содержание

StackOverflow https://stackoverflow.com/questions/3918765

  •  29-09-2019
  •  | 
  •  

Вопрос

Недавно я изменил пару моих файлов .xml из Docbook в DITA. Конверсия пошла в порядке, но есть некоторые нежелательные артефакты. Тот, который я намазал, это то, что .dita не воссоздает <para> Тег из Docbook и заменяет его <p>. Отказ Что вы бы подумали, что все будет хорошо, но это приводит к тому, что XML показать элементы и упорядоченный список как на следующей строке, т. Е.

1 элемент один 2 пункта два

вместо:

1 элемент один 2 пункта два

Так как мне это изменить:

<section>
<title>Cool Stuff</title>
<orderedlist>
  <listitem>
    <para>ItemOne</para>
  </listitem>

  <listitem>
    <para>ItemTwo</para>
  </listitem>
</orderedlist>

к этому:

<section>
<title>Cool Stuff</title>
<orderedlist>
  <listitem>
    ItemOne
  </listitem>

  <listitem>
    ItemTwo
  </listitem>
</orderedlist>

Извините, я должен был быть более понятен с вопросом. Мне нужно удалить все теги от увлечения, которые находятся на разных уровнях глубины, но всегда следуйте в (локальном) ListItem / Para. Я немного новый для этого, но мог бы я просто сделать это неправильно, притягивая его к моей трансформации Docbook2Dita. Может быть в этом месте?

Это было полезно?

Решение

Я бы использовал эту таблицу стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match ="listitem/para">
        <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>

Примечание: Перезаписать правило личности. listitem/para обойдены (это сохраняет смешанное содержание)

Другие советы

Вы можете обработать файлы DITA с XSLT, который фильтрует <para> Узлы:

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

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

  <!-- replace para nodes within an orderedlist with their content -->     
  <xsl:template match ="orderedlist/listitem/para">
    <xsl:value-of select="."/>
  </xsl:template>

</xsl:stylesheet>

У меня была похожая проблема, но я использую Qtdom, которая не всегда работает на 100%, как спецификации XSLT 2.x. (Я думаю об переходе на библиотеку Apache в какой-то момент ...)

Я хотел изменить эквивалентный «listItem» в моем коде в Div с соответствующим классом:

<xsl:for-each select="/orderedlist/lisitem">
  <div class="listitem">
    <xsl:apply-templates select="node()"/>
  </div>
</xsl:for-each>

Это удаляет список и заменяет егоu003Cdiv class="listitem">

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

<xsl:template match ="para">
  <xsl:copy-of select="node()"/>
</xsl:template>

Это удаляет теги «пункт», но держит все дети как есть. Таким образом, абзацы могут включать форматирование, и он сохраняется через обработку XSLT.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top