У меня есть XML-документ, который моделирует эту иерархию задач:
1 Customer
1.1 Product A
1.1.1 Task Alpha
1.1.2 Task Beta
1.2 Product B
1.2.1 Task Alpha
1.2.2 Task Gamma
2 Customer
2.1 Product W
2.1.1 Task Delta
Неизвестное количество клиентов, продуктов и заданий на продукт.Также может быть неизвестное количество подзадач, поэтому мы могли бы видеть это:
19.16.8.17.1 Subtask Something
XML выглядит так:
<ROWSET>
<ROW>
<PROJECT_CODE>Don't Care</PROJECT_CODE>
</ROW>
<ROW>
<PROJECT_CODE>WBS</PROJECT_CODE>
<TASK_DETAIL>
<TASKS>
<TASK>
<TASK_CODE>1</TASK_CODE>
<TASK_DESCRIPTION>Customer 1</TASK_DESCRIPTION>
<TASKS>
<TASK>
<TASK_CODE>1.1</TASK_CODE>
<TASK_DESCRIPTION>Product A</TASK_DESCRIPTION>
<TASKS>
<TASK_CODE>1.1.1</TASK_CODE>
<TASK_DESCRIPTION>Task Alpha</TASK_DESCRIPTION>
<TASKS />
<TASK_CODE>1.1.2</TASK_CODE>
<TASK_DESCRIPTION>Task Beta</TASK_DESCRIPTION>
<TASKS />
</TASKS>
</TASK>
<TASK>
<TASK_CODE>1.2</TASK_CODE>
<TASK_DESCRIPTION>Product B</TASK_DESCRIPTION>
<TASKS>
<TASK_CODE>1.2.1</TASK_CODE>
<TASK_DESCRIPTION>Task Alpha</TASK_DESCRIPTION>
<TASKS />
<TASK_CODE>1.2.2</TASK_CODE>
<TASK_DESCRIPTION>Task Gamma</TASK_DESCRIPTION>
<TASKS />
</TASKS>
</TASK>
</TASKS>
</TASK>
<TASK>
<TASK_CODE>2</TASK_CODE>
<TASK_DESCRIPTION>Customer 2</TASK_DESCRIPTION>
<TASKS>
<TASK>
<TASK_CODE>2.1</TASK_CODE>
<TASK_DESCRIPTION>Product W</TASK_DESCRIPTION>
<TASKS>
<TASK_CODE>2.1.1</TASK_CODE>
<TASK_DESCRIPTION>Task Delta</TASK_DESCRIPTION>
<TASKS />
</TASKS>
</TASK>
</TASKS>
</TASK>
</TASKS>
</TASK_DETAIL>
</ROW>
</ROWSET>
Моя первая попытка XSLT заключается в следующем:
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="ROW">
<xsl:apply-templates select="PROJECT_CODE[.='WBS']"/>
</xsl:template>
<xsl:template match="PROJECT_CODE">
<h1><xsl:value-of select="."/></h1>
<table>
<tr>
<th>Task Code</th>
<th>Description</th>
</tr>
<xsl:for-each select="./../TASK_DETAIL/TASKS/TASK">
<tr>
<td><xsl:value-of select="TASK_CODE"/></td>
<td><xsl:value-of select="TASK_DESCRIPTION"/></td>
</tr>
<xsl:for-each select="./TASKS/TASK">
<tr>
<td><xsl:value-of select="TASK_CODE"/></td>
<td><xsl:value-of select="TASK_DESCRIPTION"/></td>
</tr>
</xsl:for-each>
</xsl:for-each>
</table>
</xsl:template>
Как видите, я очень наивный подход к разбору этой вещи.Я хотел бы перечислить все задачи и подзадачи моей конкретной WBS, независимо от того, насколько глубоко она проходит.Как мне это сделать?