تلوين العناصر الفريدة في XML باستخدام XSLT
-
27-09-2019 - |
سؤال
لدي حاليًا وثيقة XML التي تتكون أساسًا من العديد من المحادثات بين الأشخاص مثل محادثة IM.
لدي كل محادثة تعرض كيف أريد حتى الآن ، إلا أنني أريد أن يكون كل اسم لونًا فريدًا لقدرة على القراءة.
كيف لدي هو أن XML يتحول إلى HTML مع CSS. أرغب في استخدام XPath و XSL 1.0 لهذا:
XML
<wtfwhispers xmlns="http://wtfwhispers.kicks-ass.org"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://wtfwhispers.kicks-ass.org wtfwhispers.xsd">
<conversation uuid="Diedrick">
<datePosted>2010-05-30</datePosted>
<description>What a great description</description>
<dialog>
<dialogDate>2009-12-22</dialogDate>
<whisper>
<whisperTime>03:55:00</whisperTime>
<speaker>Stubbymush</speaker>
<babble>i said something here</babble>
</whisper>
<whisper>
<whisperTime>03:56:00</whisperTime>
<speaker>Jaymes</speaker>
<babble>what did you say?</babble>
</whisper>
<whisper>
<whisperTime>03:56:00</whisperTime>
<speaker>Stubbymush</speaker>
<babble>i said something here!</babble>
</whisper>
...
<whisper>
<whisperTime>03:57:00</whisperTime>
<speaker>Stubbymush</speaker>
<babble>gawd ur dumb</babble>
</whisper>
</dialog>
</conversation>
</wtfwhispers>
من الناحية المثالية ما أريده هو الحصول على إخراج <p class="speaker one">
لأول مكبر صوت ، <p class="speaker two">
لل 2 وهلم جرا.
كنت أحاول استخدامها وطريقة Meunchian للعثور على عدد مكبرات الصوت الفريدة التي لدي ، لكن ما لم يكن لديّ:
...
<xsl:key name="speakerList" match="wtf:whisper" use="wtf:speaker" />
<xsl:template match="/">
<html lang="en">
<body>
<p>
<xsl:value-of select="count( key( 'speakerList', wtf:speaker ) )" />
</p>
</body>
</html>
</xsl:template>
...
عندما أقوم بإدخال "Jaymes" أو "Subbymush" ، أحصل على العدد الصحيح من المرات التي تحدث فيها المتحدث ، ولكن ليس عدد المتحدثين في مجموع المحادثة.
شكرًا مقدماً ، وإذا كان لديك أي اقتراحات لطرق أبسط لأنني أفرط في التعويض ، فيرجى تقديم المشورة.
المحلول
هذا التحول:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:w="http://wtfwhispers.kicks-ass.org"
>
<xsl:output method="text"/>
<xsl:key name="kSpeakerByVal" match="w:speaker" use="."/>
<xsl:template match="/">
<xsl:value-of select=
"count(
/*/*/*/w:whisper/w:speaker
[generate-id()
=
generate-id(key('kSpeakerByVal',.)[1])
]
)
"/>
</xsl:template>
</xsl:stylesheet>
عند تطبيقه على مستند XML المقدم ، ينتج عدد السماعات الصحيح:
2