私は次のXML(簡体字)を持っています
<?xml version="1.0" encoding="UTF-8"?>
<REPOSITORY>
<VIEW UPDATED_BY="SADMIN">
<VIEW_LOCALE UPDATED_BY="SADMIN"> </VIEW_LOCALE>
<VIEW_WEB_TEMPLATE UPDATED_BY="SADMIN" COMMENTS="TEST COMMENT">
<VIEW_WEB_TEMPLATE_ITEM UPDATED_BY="SADMIN"></VIEW_WEB_TEMPLATE_ITEM>
</VIEW_WEB_TEMPLATE>
</VIEW>
<VIEW UPDATED_BY="USER">
<VIEW_LOCALE UPDATED_BY="USER"> </VIEW_LOCALE>
<VIEW_WEB_TEMPLATE UPDATED_BY="USER">
<VIEW_WEB_TEMPLATE_ITEM UPDATED_BY="USER"></VIEW_WEB_TEMPLATE_ITEM>
<VIEW_WEB_TEMPLATE_ITEM UPDATED_BY="USER2"></VIEW_WEB_TEMPLATE_ITEM>
</VIEW_WEB_TEMPLATE>
</VIEW>
</REPOSITORY>
この XML をトラバースし、出力を HTML テーブルとして出力する必要があります。以下は私が思いついたXSLです
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match ="/" >
<html><head></head>
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="/" >
<xsl:for-each select="REPOSITORY/VIEW">
<table>
<tr>
<td>Updated By</td>
<td><xsl:value-of select="@UPDATED_BY" /></td>
</tr>
</table>
<xsl:if test="./VIEW_WEB_TEMPLATE">
<table>
<tr><td>Updated By</td><td>Comments</td></tr>
<xsl:for-each select="*[name()='VIEW_WEB_TEMPLATE']">
<tr>
<td><xsl:value-of select="@UPDATED_BY" /></td>
<td><xsl:value-of select="@COMMENTS" /></td>
</tr>
</xsl:for-each> <!-- end of view_web_template -->
</table>
<xsl:if test="./VIEW_WEB_TEMPLATE_ITEM">
<table>
<tr><td>Updated by</td></tr>
<xsl:for-each select="./VIEW_WEB_TEMPLATE_ITEM">
<tr>
<td><xsl:value-of select="@UPDATED_BY" /></td>
</tr>
</xsl:for-each> <!-- end of web_template_item -->
</table>
</xsl:if>
</xsl:if>
</xsl:for-each> <!-- end of view -->
</xsl:template>
</xsl:stylesheet>
これが最善の方法ではないことはわかっていますが、テーブルでVIEW_WEB_TEMPLATE_ITEMノード データを取得できません。if 条件が失敗します。
for-each によりVIEW_WEB_TEMPLATEノードが既に処理されていることが原因ではないかと思います。
したがって、以前に処理されたノードに子がある場合、私のXPATHはそれを選択する必要がありますが、私はそれを行うことができるXSLTの専門家ではありません。ポインタはありますか??