XSL: удаление тегов xml, но сохранение их содержимого - PullRequest
1 голос
/ 13 октября 2010

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

1
 item One
2
 item Two

вместо:

1 item One
2 item Two

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

<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. Может ли это быть в этом месте?

Ответы [ 3 ]

5 голосов
/ 13 октября 2010

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

<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 обойдены (это сохраняет смешанный контент)

3 голосов
/ 13 октября 2010

Вы можете обрабатывать файлы 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>
0 голосов
/ 10 января 2014

У меня была похожая проблема, но я использую 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>

Это удаляет список и заменяет его на

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

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

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

...