0

我有以下 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 条件失败。

我怀疑这可能是由于VIEW_WEB_TEMPLATE节点由于 for-each 已经被处理。

所以我的 XPATH 应该是如果先前处理的节点有子节点然后选择它,但我在 XSLT 方面不够专家能够做到这一点。任何指针?

4

1 回答 1

0

XSLT 不关心(或跟踪)哪些节点已被处理。多次选择和处理相同的节点是完全有效的。

这种情况下的问题是上下文之一。第一条和第二条xsl:if语句具有相同的 XSLT 上下文,即一个VIEW元素。但要匹配 VIEW_WEB_TEMPLATE_ITEM 元素,上下文必须是 VIEW_WEB_TEMPLATE 元素。从纯技术的角度来看,您需要做的就是编写<xsl:if select="VIEW_WEB_TEMPLATE/VIEW_WEB_TEMPLATE_ITEM">,并且条件为真。

也就是说,在您的特定情况下,我想您会想要将第二个条件移到<xsl:for-each>. 那么它无论如何都会在正确的上下文中,因为<xsl:for-each>进程 VIEW_WEB_TEMPLATE 元素。

于 2013-07-07T14:34:40.193 回答