XSL: удаление тегов XML, но сохраняя их содержание
Вопрос
Недавно я изменил пару моих файлов .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.