我想根據元素名稱(然後通過相同的屬性名稱)在標題下對XPath的結果進行分類。注意:XML數據可能不一致,並且某些具有相同名稱的元素可能具有不同的屬性,因此它們需要不同的標題。元素和屬性名稱的動態分組
我似乎無法寫出自己的文字問題,所以它可能是最好用一個例子..
XML:
<pets>
<dog name="Frank" cute="yes" color"brown" type="Lab"/>
<cat name="Fluffy" cute="yes" color="brown"/>
<cat name="Lucy" cute="no" color="brown"/>
<dog name="Spot" cute="no" color="brown"/>
<dog name="Rover" cute="yes" color="brown"/>
<dog name="Rupert" cute="yes" color="beige" type="Pug"/>
<cat name="Simba" cute="yes" color="grey"/>
<cat name="Princess" color="brown"/>
</pets>
的XPath:
//*[@color='brown']
輸出應該看起來像什麼樣(對於不同的元素具有不同的標題):
ElementName Color Cute Name Type
Dog Brown Yes Frank Lab
ElementName Color Cute Name
Dog Brown No Spot
Dog Brown Yes Rover
ElementName Color Cute Name
Cat Brown Yes Fluffy
Cat Brown No Lucy
ElementName Color Name
Cat Brown Princess
的XSL我現在有(簡化!):
<xsl:apply-templates select="//*[@color='brown']" mode="result">
<xsl:sort select="name()" order="ascending"/>
</xsl:apply-templates>
<xsl:template match="@*|node()" mode="result">
<tr>
<th align="left">Element</th>
<xsl:for-each select="@*">
<xsl:sort select="name()" order="ascending"/>
<th align="left">
<xsl:value-of select="name()"/>
</th>
</xsl:for-each>
</tr>
<tr>
<td align="left">
<xsl:value-of select="name()"/>
</td>
<xsl:for-each select="@*">
<xsl:sort select="name()" order="ascending"/>
<td align="left">
<xsl:value-of select="."/>
</td>
</xsl:for-each>
</tr>
</xsl:template>
這上面XSL對其進行排序正確的方式我想..但現在我需要某種形式的檢查,看看哪些元素具有相同的名稱,然後如果它們具有相同的名稱,它們是否具有相同的屬性。一旦我完成了這項檢查,我就可以將一般的「標題」放在具有匹配元素名稱和屬性的記錄集之上。
我想我可以使用xsl:選擇xsl:when並做一些測試。我想(正確的排序已經完成後):
If element name != previous element name
create headings
Else if all attributes != all previous element's attributes
create headings
我想我最大的問題是,是,我不知道如何檢查以前返回的數據集是什麼?有人可以告訴我如何做到這一點?
或者,如果我接近這個錯誤..讓我更好的解決方案?
希望一切都有道理!讓我知道你是否需要澄清!
在此先感謝您的耐心和迴應! :)
很好的問題! (+1)。查看我的答案,瞭解一個通用高效的XSLT 1.0解決方案,該解決方案可以處理任何可能的元素和屬性組合。 :) – 2010-07-23 02:13:38