XSLT - مطابقة العقد التي تحتوي على عقدة معينة بداخلها (مثل jQuery ": HAS")

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

  •  03-07-2019
  •  | 
  •  

سؤال

لنفترض أن لدي ملف XML التالي

<a id="123">
   <b type="foo" value="1" />
   <b type="baz" value="1" />
</a>
<a id="789">
  <b type="bar" value="12" />
</a>
<a id="999">
   <b type="foo", value="2" />
</a>

أرغب في الحصول على قائمة بجميع العقد "A" التي تحتوي على نود فرعي "B" مع type = "foo" و value = "1". يمكنك أن تفعل شيئًا مشابهًا في jQuery مع ": HAS" Selector.

بالنسبة للسجل الذي أخطط لاستخدام XMLStarlet على سطر الأوامر (لكنني لست متزوجًا من القيام بذلك بهذه الطريقة) ، لذلك سيكون XSLT الذي يعمل بهذه الطريقة أفضل.

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

المحلول

شيء من هذا القبيل:

a[b[@type='foo'][@value='1']]

يجب أن تفعل الخدعة

نصائح أخرى

يمكن القيام بذلك باستخدام تعبير XPath واحد كما هو موضح في إجابة Gizmo.

لأن السؤال مخصص على وجه التحديد لـ XSLT ، هنا حل XSLT فعال باستخدام المفاتيح:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>
<!--                                      --> 
 <xsl:key name="kAByBTypeVal" 
  match="a"
  use="concat(b/@type,'+',b/@value)"/>
<!--                                      -->       
    <xsl:template match="/">
      <xsl:copy-of select=
       "key('kAByBTypeVal', 'bar+12')"/>
    </xsl:template>
</xsl:stylesheet>

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

<t>
    <a id="123">
        <b type="foo" value="1" />
        <b type="baz" value="1" />
    </a>
    <a id="789">
        <b type="bar" value="12" />
    </a>
    <a id="999">
        <b type="foo" value="2" />
    </a>
</t>

يتم إنتاج النتيجة الصحيحة:

<a id="789">
  <b type="bar" value="12"/>
</a>

أعتقد أن هذا سيكون: /b [ @type = 'foo' و @value = 1] /parent :: a

<xsl:variable name="nodeList" select="a[b[@type='foo' and @value=1]]"/>

<xsl:for-each select="$nodeList">
    <xsl:value-of select="."/>
</xsl:for-each>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top