كيفية الحصول على المعلومات والفرز، مجموعة فرعية من العناصر مع المعرفات فقط باستخدام XSLT؟

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

  •  19-09-2019
  •  | 
  •  

سؤال

أنا جديد على XSLT ولا يمكنني حل المشكلة التالية:

لدي ملف XML مثل هذا:

<root>
    <subset>
        <e id="A"></e>
        <e id="C"></e>
    </subset>

    <data>
        <info id="A" order="3" name="ANode"></info>
        <info id="B" order="4" name="BNode"></info>
        <info id="C" order="1" name="CNode"></info>
        <info id="D" order="2" name="DNode"></info>
    </data>
</root>

وأريد إنتاج هذا:

<root>
    <newnode id="C" order="1" name="CNode"></newnode>
    <newnode id="A" order="3" name="ANode"></newnode>
</root>

كما ترون الفكرة هي "إكمال" مجموعة فرعية من المعرفات عن طريق استرجاع المعلومات المعنية، وفرزها وفقا لطلبها المحدد <data>.

لاحظ أن <data> من المفترض أن يكون لديك الكثير من العقد الطفل.

أيضا، أنا فصل العقد بالمعلومات عن <data> عنصر من مجموعات المعرفات الفرعية، لأنني سيكون لدي العديد من المجموعات الفرعية ولا أرغب في الحصول على معلومات متكررة "في أي مكان".

شكرا لك مقدما.

هل كانت مفيدة؟

المحلول

يمكنك أيضا المفتاح الفرعي اعتمادا على ما قد تحتاج إلى القيام به مع بياناتك الفعلية.

<xsl:output indent="yes" />

<xsl:key name="subset" match="e" use="@id" />

<xsl:template match="/">
    <root>
    <xsl:for-each select="//info[count(key('subset',@id)[1]) &gt; 0]">
        <xsl:sort select="@order" data-type="number" />
        <newnode id="{@id}" order="{@order}" name="{@name}" />
    </xsl:for-each>
    </root>
</xsl:template>

نصائح أخرى

المراجع العرضية طلب استخدام المفاتيح:

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

  <xsl:output indent="yes"/>

  <xsl:key name="k1" match="info" use="@id"/>

  <xsl:template match="root">
    <xsl:copy>
      <xsl:apply-templates select="subset/e">
        <xsl:sort select="key('k1', @id)/@order" data-type="number"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="e">
    <newnode id="{@id}" order="{key('k1', @id)/@order}" name="{key('k1', @id)/@name}"/>
  </xsl:template>

</xsl:stylesheet>

يجب أن تفعل ذلك لعينة الإدخال التي قدمتها.

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