كيفية إزالة عناصر من xml باستخدام xslt مع الأنماط و xsltproc?

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

  •  11-07-2019
  •  | 
  •  

سؤال

لدي الكثير من ملفات XML التي لها شيء من شكل:

<Element fruit="apple" animal="cat" />

التي أريد إزالتها من ملف.

باستخدام XSLT و لينكس أداة سطر الأوامر xsltproc, كيف يمكن أن أفعل هذا ؟

من خلال هذه النقطة في البرنامج النصي لدي قائمة من الملفات التي تحتوي على عنصر كنت ترغب في إزالة ، وبالتالي فإن ملف واحد يمكن أن تستخدم المعلمة.


تحرير: السؤال أصلا تفتقر إلى نية.

ما أحاول تحقيقه هو إزالة العنصر بأكمله "العنصر" حيث (الفاكهة=="أبل" && الحيوان=="القط").في نفس الوثيقة أن هناك العديد من العناصر يدعى "العنصر" أتمنى لهذه بالبقاء.لذلك

<Element fruit="orange" animal="dog" />
<Element fruit="apple"  animal="cat" />
<Element fruit="pear"   animal="wild three eyed mongoose of kentucky" />

سوف تصبح:

<Element fruit="orange" animal="dog" />
<Element fruit="pear"   animal="wild three eyed mongoose of kentucky" />
هل كانت مفيدة؟

المحلول

باستخدام واحدة من أهم XSLT أنماط التصميم:"تجاوز تحول الهوية"واحدة فقط أكتب ما يلي:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output omit-xml-declaration="yes"/>

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

    <xsl:template match="Element[@fruit='apple' and @animal='cat']"/>
</xsl:stylesheet>

ملاحظة الطريقة الثانية قالب يتجاوز الهوية (1) القالب فقط على العناصر يدعى "العنصر" أن يكون سمة "الفاكهة" مع قيمة "أبل" و السمة "الحيوان" مع قيمة "القط".هذا القالب لديه فارغة الجسم ، مما يعني أن يقابل عنصر هو ببساطة تجاهل (لا شيء ينتج عندما يقابل ذلك).

عندما يكون هذا التحول يتم تطبيقها على مصدر التالية مستند XML:

<doc>... 
    <Element name="same">foo</Element>...
    <Element fruit="apple" animal="cat" />
    <Element fruit="pear" animal="cat" />
    <Element name="same">baz</Element>...
    <Element name="same">foobar</Element>...
</doc>

من يريد النتيجة المنتجة:

<doc>... 
    <Element name="same">foo</Element>...
    <Element fruit="pear" animal="cat"/>
    <Element name="same">baz</Element>...
    <Element name="same">foobar</Element>...
</doc>

المزيد من التعليمات البرمجية المتكررة من استخدام تجاوز الهوية قالب يمكن العثور عليها هنا.

نصائح أخرى

والجواب عن طريق Dimitre Novatchev هي بالتأكيد كلا الصحيحة وأنيقة، ولكن هناك تعميما (أن OP لم يسأل عنه): ما إذا كان العنصر الذي تريد تصفية ديه أيضا عناصر تابعة أو النص الذي تريد إبقاء ؟

وأعتقد أن هذا الاختلاف طفيف يغطي هذه الحالة:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    version="2.0">

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

    <!-- drop DropMe elements, keeping child text and elements -->
    <xsl:template match="DropMe">
        <xsl:apply-templates/>
    </xsl:template>

</xsl:stylesheet>

ويمكن أن يكون معقدا الشرط مباراة لتحديد سمات أخرى، وما إلى ذلك، ويمكنك استخدام متعددة مثل هذه القوالب إذا كنت اسقاط أشياء أخرى.

وحتى هذه المدخلات:

<?xml version="1.0" encoding="UTF-8"?>
<mydocument>
    <p>Here's text to keep</p>
    <p><DropMe>Keep this text but not the element</DropMe>; and keep what follows.</p>
    <p><DropMe>Also keep this text and <b>this child element</b> too</DropMe>, along with what follows.</p>
</mydocument>

وتنتج هذا الإخراج:

<?xml version="1.0" encoding="UTF-8"?><mydocument>
    <p>Here's text to keep</p>
    <p>Keep this text but not the element; and keep what follows.</p>
    <p>Also keep this text and <b>this child element</b> too, along with what follows.</p>
</mydocument>

XSLT كتاب الطبخ .

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