Я хотел бы классифицировать результаты 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: choose xsl: when и выполнить несколько тестов.Я думал (после правильного упорядочения):
If element name != previous element name
create headings
Else if all attributes != all previous element's attributes
create headings
Думаю, моя самая большая проблема заключается в том, что я не знаю, как проверить, какой предыдущий набор данных был ... Можеткто-нибудь, пожалуйста, скажите мне, как это сделать?
Или, если я подхожу к этому неправильно ... привести меня к лучшему решению?
Надеюсь, что все это имеет смысл!Дайте мне знать, если вам нужны разъяснения!
Заранее спасибо за ваше терпение и ответы!:)