XSL: إزالة علامات XML ولكن الحفاظ على محتوياتها
سؤال
لقد قمت مؤخرًا بتغيير اثنين من ملفات .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>
أنا آسف ، كان ينبغي أن أكون أكثر وضوحًا مع السؤال. أحتاج إلى إزالة جميع العلامات من Doument التي تكون في مستويات مختلفة من العمق ، ولكن دائمًا ما اتبع (محلي) 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. (أنا أفكر في التحول إلى مكتبة أباتشي في مرحلة ما ...)
كنت أرغب في تغيير "ListItem" المكافئ في الكود الخاص بي في DIV مع فئة مقابلة:
<xsl:for-each select="/orderedlist/lisitem">
<div class="listitem">
<xsl:apply-templates select="node()"/>
</div>
</xsl:for-each>
هذا يزيل القائمة ويحل محلهu003Cdiv class="listitem" style=";text-align:right;direction:rtl">
ثم القالب ، ما لديكu003Cpara> في حالتي ، يمكن أن تتضمن علامات ، لذلك لم أتمكن من استخدام مثالين آخرين من شأنه أن يحول كل شيء إلى نص عادي. بدلاً من ذلك ، استخدمت ذلك:
<xsl:template match ="para">
<xsl:copy-of select="node()"/>
</xsl:template>
هذا يزيل علامات "الفقرة" ، لكنه يحافظ على جميع الأطفال كما هو. لذلك يمكن أن تتضمن الفقرات التنسيق ويتم الحفاظ عليها عبر معالجة XSLT.