سؤال

مقتطف XML:

<AA>
  <BB>foo</BB>
  <CC>bar</CC>
  <DD>baz</DD>
  <EE>bar</EE>
</AA>

كيف يمكنني اختيار جميع العقدات الطفل <AA> التي لديها bar كما محتوياتها؟ في المثال أعلاه، أود اختيار <CC> و <EE>. وبعد أفكر في الحل شيء مثل:

<xsl:template match="AA">
  <xsl:for-each select="???" />
</xsl:template>
هل كانت مفيدة؟

المحلول

أحد أبسط حلول سؤال OP هو تعبير XPath التالي:

*/*[.='bar']

هل تريد ملاحظة أنه لا يوجد تعليمات XSLT - هذا هو مجرد تعبير XPath, ، وبالتالي فإن السؤال لا يمكن وضع علامة فقط XPath.

من هنا، يمكن للمرء استخدام التعبير XPath هذا في XSLT بطرق مختلفة، مثل تطبيق القوالب عند جميع العقد المحددة.

على سبيل المثال، يوجد أدناه تحويل XSLT الذي يأخذ مستند XML وينتج مكتبا آخر، حيث جميع العناصر - أطفال <AA> الذي محتويات لا يساوي "bar" يتم حذفها:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

    <xsl:template match="AA">
      <xsl:copy>
         <xsl:apply-templates select="*[. = 'bar']"/>
      </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

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

<AA>
    <BB>foo</BB>
    <CC>bar</CC>
    <DD>baz</DD>
    <EE>bar</EE>
</AA>

يتم إنتاج النتيجة المطلوبة:

<AA>
   <CC>bar</CC>
   <EE>bar</EE>
</AA>

القيام مذكرة:

في نمط المباراة، لا نحتاج عادة إلى تحديد تعبير XPath المطلق، ولكن مجرد أحد الأقارب، لذلك يتم تبسيط تعبير XPath الكامل بشكل طبيعي إلى نمط المباراة هذا:

*[. = 'bar']
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top