Боюсь, что с вашим XSLT довольно много проблем, хотя ни одно из них трудно решить ...
- В вашем шаблоне соответствует
/
, вы делаете <xsl:for-each select="ITAB/DATA">
, но /
соответствует узлу документа, который является родителем вашего root
элемента. Следовательно, ваше предложение select ничего не выберет. Вы должны изменить шаблон, чтобы он соответствовал /root
(или просто root
)
- XSLT не является правильно сформированным XML, как вы делаете
<xsl:apply-templates select="OPERATION">
, который не является закрытым. Это должно быть <xsl:apply-templates select="OPERATION" />
- Переменные являются локальными для блока, в котором они объявлены, поэтому текущее объявление
$Operation
будет фактически доступно только с блоком <tr>...</tr>
. На самом деле вы можете просто переместить объявление в шаблон, соответствующий OPERATION
(где он должен был бы стать <xsl:variable name="Operation" select="."/>
, поскольку текущий узел будет OPERATION
на этом этапе.
<xsl:if test="OPERATION={$Operation}">
недопустимый синтаксис. Это должно быть просто <xsl:if test="OPERATION=$Operation">
, потому что XSLT уже ожидал выражения здесь.
- На самом деле вам вообще не нужен
xsl:if
, потому что вы можете добавить его к xsl:for-each
примерно так ... <xsl:for-each select="TAB/DATA[OPERATION=$Operation]">
- На самом деле, это тоже не сработает, потому что вы в настоящее время сопоставляете узел
OPERATION
, вложенный в элемент ITAB
, и у него нет TAB
как дочернего элемента. Вы действительно хотите выбрать TAB/DATA
в другом месте документа. Итак, вы должны сделать <xsl:for-each select="//TAB/DATA[OPERATION=$Operation]">
Попробуйте это XSLT ....
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="root">
<html>
<body>
<table border="1">
<tr bgcolor="#9acd32">
<th>OPERATION</th>
<th>Table</th>
</tr>
<xsl:for-each select="ITAB/DATA">
<tr>
<td><xsl:value-of select="OPERATION"/></td>
<td><xsl:apply-templates select="OPERATION" /></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="OPERATION">
<xsl:variable name="Operation" select="."/>
<table border="1">
<tr bgcolor="#9acd32">
<th>OPERATION</th>
<th>WORKINSTRUCTION</th>
<th>REVISION</th>
</tr>
<xsl:for-each select="//TAB/DATA[OPERATION=$Operation]">
<tr>
<td><xsl:value-of select="OPERATION"/></td>
<td><xsl:value-of select="WORKINSTRUCTION"/></td>
<td><xsl:value-of select="REVISION"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
Сказав, что, как уже упоминалось в комментариях, гораздо лучше использовать xsl:key
для поиска данных из других частей документа XML.
Итак, определите ключ следующим образом:
<xsl:key name="tabs" match="TAB/DATA" use="OPERATION" />
И получить соответствующие узлы, как ...
<xsl:for-each select="key('tabs', $Operation)">
На самом деле вам не нужно здесь использовать переменную. Попробуйте это XSLT тоже:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="tabs" match="TAB/DATA" use="OPERATION" />
<xsl:template match="root">
<html>
<body>
<table border="1">
<tr bgcolor="#9acd32">
<th>OPERATION</th>
<th>Table</th>
</tr>
<xsl:for-each select="ITAB/DATA">
<tr>
<td><xsl:value-of select="OPERATION"/></td>
<td><xsl:apply-templates select="OPERATION" /></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="OPERATION">
<table border="1">
<tr bgcolor="#9acd32">
<th>OPERATION</th>
<th>WORKINSTRUCTION</th>
<th>REVISION</th>
</tr>
<xsl:for-each select="key('tabs', .)">
<tr>
<td><xsl:value-of select="OPERATION"/></td>
<td><xsl:value-of select="WORKINSTRUCTION"/></td>
<td><xsl:value-of select="REVISION"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
См. Это в действии на http://xsltfiddle.liberty -development.net / pPqsHUi