【问题标题】:XML output to HTML using XSL使用 XSL 将 XML 输出到 HTML
【发布时间】:2013-07-07 14:20:36
【问题描述】:

我有以下 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 方面不够专业,无法做到这一点。 有什么指点吗??

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

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

    这种情况下的问题是上下文之一。第一个和第二个xsl:if 语句具有相同的XSLT 上下文,即VIEW 元素。但要匹配 VIEW_WEB_TEMPLATE_ITEM 元素,上下文必须是 VIEW_WEB_TEMPLATE 元素。从纯技术角度来说,只要写&lt;xsl:if select="VIEW_WEB_TEMPLATE/VIEW_WEB_TEMPLATE_ITEM"&gt;,条件就会成立。

    也就是说,在您的特定情况下,我想您会希望将第二个条件移到 &lt;xsl:for-each&gt; 中。那么它无论如何都会在正确的上下文中,因为 &lt;xsl:for-each&gt; 处理 VIEW_WEB_TEMPLATE 元素。

    【讨论】:

    • 谢谢,效果很好。我不能在 for-each 中使用它,因为它需要是独立的表。所以我改变了 if 和 select 子句。
    猜你喜欢
    • 1970-01-01
    • 2016-11-18
    • 2014-12-20
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多