أداء مجموعة "Group" الاستعلام في XPath XSL
سؤال
نظرا XML التالية:
<results name="queryResults">
<int name="intfield1:[* TO 10]">11</int>
<int name="intfield2:[10 TO 20]">9</int>
<int name="intfield1:[10 TO 20]">12</int>
</results>
أود أن تنتج هذه XML:
<results>
<field name="numberfield1">
<value name="[* TO 10]">11</value>
<value name="[10 TO 10]">12</value>
</field>
<field name="numberfield2">
<value name="[10 TO 20]">9</value>
</field>
</results>
لا أستطيع التفكير في كيفية القيام بذلك في XSL أساسا لأنني الرغبة مجموعة من numbericfield..كل ما يمكن أن تأتي مع هذا:
<xsl:if test="count(results/int) > 0">
<results>
<xsl:for-each select="results/int">
<field>
<xsl:attribute name="name">
<xsl:value-of select="substring-before(@name, ':')"/></xsl:attribute>
<value>
<xsl:attribute name="name">
<xsl:value-of select="substring-after(@name, ':') "/>
</xsl:attribute>
<xsl:value-of select="."/>
</value>
</field>
</xsl:for-each>
</results>
</xsl:if>
ولكن هذا لا تنتج لطيفة تجميع قائمة بدلا أحصل على هذا:
<results>
<field name="numberfield1">
<value name="[* TO 10]">11</value>
</field>
<field name="numberfield2">
<value name="[10 TO 20]">9</value>
</field>
<field name="numberfield1">
<value name="[10 TO 10]">12</value>
</field>
</results>
إذا كان شخص ما يمكن أن ستير لي في الاتجاه الصحيح..سيكون هذا رائعا ؟
شكرا
المحلول
للقيام بذلك في XSLT 1.0, سيكون لديك لاستخدام تقنية تسمى "muenchian التجمع".أولا إنشاء مفتاح العقد التي كنت ترغب في المجموعة
<xsl:key name="intfield" match="int" use="substring-before(@name, ':')" />
بعد ذلك ، يمكنك تكرار خلال كافة العقد ، ولكن فقط اختيار تلك التي يحدث أن تكون الأولى في المجموعات ذات الصلة
<xsl:for-each select="int[generate-id() = generate-id(key('intfield', substring-before(@name, ':'))[1])]">
التالي, يمكنك تكرار استخدام مفتاح تكرار عبر كافة العقد في نظام المجموعة
<xsl:variable name="intfieldname" select="substring-before(@name, ':')"/>
<xsl:for-each select="key('intfield', $intfieldname)">
وضع كل هذا معا يعطي
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml"/>
<xsl:key name="intfield" match="int" use="substring-before(@name, ':')"/>
<xsl:template match="/results">
<results>
<xsl:for-each select="int[generate-id() = generate-id(key('intfield', substring-before(@name, ':'))[1])]">
<xsl:variable name="intfieldname" select="substring-before(@name, ':')"/>
<field>
<xsl:attribute name="name">
<xsl:value-of select="$intfieldname"/>
</xsl:attribute>
<xsl:for-each select="key('intfield', $intfieldname)">
<value>
<xsl:attribute name="name">
<xsl:value-of select="substring-after(@name, ':')"/>
</xsl:attribute>
<xsl:value-of select="."/>
</value>
</xsl:for-each>
</field>
</xsl:for-each>
</results>
</xsl:template>
</xsl:stylesheet>
في المثال الخاص بك ، 'intfield' تصبح 'numberfield' على الرغم من.أبقيت اسم 'intfield' في المثال أعلاه.
- إصلاح الخطأ المطبعي.
نصائح أخرى
وتجمع Muenchian هو عمل عبقري. ليس من السهل أن نفهم، ولكن انظر: http://www.jenitennison.com/xslt/grouping/muenchian.html
لتبسيط العملية W3C دعم تحديدا التجمع في XSLT2.0. انظر على سبيل المثال: http://www.xml.com/pub/a/ 2003/11/05 / tr.html
ولكن ليس كل XSLT2.0 بيئات دعم