Я относительно новичок в XSLT и мне интересно, есть ли альтернативные (и, возможно, более эффективные) способы управления выводом одного набора / типа узлов XML на основе другого набора узлов в том же документе.
Например, с учетом следующего XML:
<?xml version="1.0" encoding="UTF-8"?>
<table>
<titles>
<title1>Header Column One</title1>
<title2/>
<title3>Header Column Three</title3>
<title4/>
<title5/>
</titles>
<valueRows>
<valueRow>
<value1>Data Row1 Value1</value1>
<value2>Data Row1 Value2</value2>
<value3>Data Row1 Value3</value3>
<value4>Data Row1 Value4</value4>
<value5/>
</valueRow>
<valueRow>
<value1>Data Row2 Value1</value1>
<value2>Data Row2 Value2</value2>
<value3>Data Row2 Value3</value3>
<value4>Data Row2 Value4</value4>
<value5/>
</valueRow>
</valueRows>
</table>
Я хочу использовать узлы / table / title / title #, чтобы определить, какие элементы / table / valueRows / valueRow / value # отображать. В частности, если заголовок имеет данные, должны отображаться соответствующие значения. Если заголовок пуст, соответствующие значения не должны отображаться. Даже если это их содержание.
Исходя из приведенного выше примера, результат будет:
<table>
<tr>
<th>Header Column One</th>
<th>Header Column Three</th>
</tr>
<tr>
<td>Data Row1 Value1</td>
<td>Data Row1 Value3</td>
</tr>
<tr>
<td>Data Row2 Value1</td>
<td>Data Row2 Value3</td>
</tr>
</table>
XSLT, который я придумал для создания этого вывода, выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<table>
<tr>
<xsl:if test="/table/titles/title1 != ''">
<th>
<xsl:value-of select="/table/titles/title1"/>
</th>
</xsl:if>
<xsl:if test="/table/titles/title2 != ''">
<th>
<xsl:value-of select="/table/titles/title2"/>
</th>
</xsl:if>
<xsl:if test="/table/titles/title3 != ''">
<th>
<xsl:value-of select="/table/titles/title3"/>
</th>
</xsl:if>
<xsl:if test="/table/titles/title4 != ''">
<th>
<xsl:value-of select="/table/titles/title4"/>
</th>
</xsl:if>
<xsl:if test="/table/titles/title5 != ''">
<th>
<xsl:value-of select="/table/titles/title5"/>
</th>
</xsl:if>
</tr>
<xsl:for-each select="/table/valueRows/valueRow">
<tr>
<xsl:if test="/table/titles/title1 != ''">
<td>
<xsl:value-of select="value1"/>
</td>
</xsl:if>
<xsl:if test="/table/titles/title2 != ''">
<td>
<xsl:value-of select="value2"/>
</td>
</xsl:if>
<xsl:if test="/table/titles/title3 != ''">
<td>
<xsl:value-of select="value3"/>
</td>
</xsl:if>
<xsl:if test="/table/titles/title4 != ''">
<td>
<xsl:value-of select="value4"/>
</td>
</xsl:if>
<xsl:if test="/table/titles/title5 != ''">
<td>
<xsl:value-of select="value5"/>
</td>
</xsl:if>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
Чтобы помочь в изучении входов и выходов XSLT, у меня вопрос, есть ли альтернативные / лучшие / более эффективные способы сделать то же самое.