XSLT - مطابقة العقد التي تحتوي على عقدة معينة بداخلها (مثل jQuery ": HAS")
سؤال
لنفترض أن لدي ملف 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>
لا تنتمي إلى StackOverflow