Я хочу получить список всех проектов. Даже если они Sub
Такие проекты, как A11 внутри A1, я хочу
каждый отдельный идентификатор проекта.
Кроме того, я хочу, чтобы этот список был доступен для меня в нескольких местах,
Ex. При разборе проекта А1 или во время
разбор A11 или любой другой уровень вложенности
проекта
Есть ли способ достичь этого в
XSLT?
Вы не указали, возможно ли иметь более одного элемента <proj>
с таким же значением его дочернего элемента <id>
.
Вот решение XSLT, которое определяет две глобальные переменные , одна - набор узлов всех элементов <id>
в документе XML, другая - набор узлов из <id>
элементов каждая значение которого отличается от значений остальных, и все значения <id>
s представлены отдельно.
Поскольку это глобальные переменные, они доступны в любой точке вашего кода XSLT, даже в импортированных / включенных или импортируемых / включающих таблицы стилей.
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kIdByVal" match="id" use="."/>
<xsl:variable name="vallProjIds" select="//proj/id"/>
<xsl:variable name="vdistinctProjIds" select=
"//proj/id[generate-id()
=
generate-id(key('kIdByVal', .)[1])
]
"/>
<xsl:template match="/">
All Project IDs:
<xsl:for-each select="$vallProjIds">
<xsl:value-of select="concat(.,'
')"/>
</xsl:for-each>
All Distinct Project IDs:
<xsl:for-each select="$vdistinctProjIds">
<xsl:value-of select="concat(.,'
')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к следующему документу XML (основано на предоставленном документе, но выполнено правильно и расширено, чтобы охватить больше случаев):
<company>
<dept>
<name> Dept-A</name>
<proj>
<id> A1 </id>
<noOfPeople> 5 </noOfPeople>
<proj>
<id>A11</id>
<noOfPeople> 2 </noOfPeople>
</proj>
</proj>
</dept>
<dept>
<name> Dept-B</name>
<proj>
<id> A1 </id>
<noOfPeople> 5 </noOfPeople>
</proj>
<proj>
<id> B1 </id>
<noOfPeople> 5 </noOfPeople>
<proj>
<id>B11</id>
<noOfPeople> 2 </noOfPeople>
</proj>
</proj>
</dept>
</company>
желаемый, правильный результат выдается :
All Project IDs:
A1
A11
A1
B1
B11
All Distinct Project IDs:
A1
A11
B1
B11
Обратите внимание , что это решение использует метод Мюнхена для группировки, чтобы получить набор Id
s с уникальными значениями.