XSL: إزالة علامات XML ولكن الحفاظ على محتوياتها

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

  •  29-09-2019
  •  | 
  •  

سؤال

لقد قمت مؤخرًا بتغيير اثنين من ملفات .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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top