XML到XSL文件

时间:2015-12-03 10:00:39

标签: xml xslt

我有xml文件,如下所示

<?xml version="1.0" encoding="utf-8" ?>
<statusfile>
  <job>
      <name>Test2</name>
      <curstatus>SUCCESS</curstatus>
      <stablerevision>5752</stablerevision>
      <curdate>12/02/2015</curdate>
      <prevstatus>FAILURE</prevstatus>
      <prevstable>5745</prevstable>
      <prevdate>12/01/2015</prevdate>
  </job>
  <job>
    <name>Test3</name>
    <curstatus>SUCCESS</curstatus>
    <stablerevision>5752</stablerevision>
    <curdate>12/02/2015</curdate>
    <prevstatus>SUCCESS</prevstatus>
    <prevstable>5745</prevstable>
    <prevdate>12/01/2015</prevdate>
  </job>
</statusfile>

这是我为xsl文件试过的,

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">
    <table width="500px" border="1px" style="text-align:left;font-family:consolas">
      <tr bgcolor="#2EFEF7">
        <td bgcolor="#2EFEF7">
          <b>JOB-NAME</b>
        </td>
        <td bgcolor="#2EFEF7">
          <b>CURRENT-STATUS</b>
        </td>
        <td bgcolor="#2EFEF7">
          <b>REVISION</b>
        </td>
        <td bgcolor="#2EFEF7">
          <b>DATE</b>
        </td>
        <td bgcolor="#2EFEF7">
          <b>PREVIOUS-STATUS</b>
        </td>
        <td bgcolor="#2EFEF7">
          <b>REVISION</b>
        </td>
        <td bgcolor="#2EFEF7">
          <b>DATE</b>
        </td>
      </tr>      
      <xsl:for-each select="statusfile/job">
        <xsl:choose>
          <xsl:when test="curstatus and prevstatus != 'SUCCESS'">
            <xsl:for-each select="statusfile/job/currentstatus">
            <tr bgcolor="#C1E3E8">
              <td style="font-weight:bold" bgcolor="#FF0000">
                <xsl:value-of select="name"/>
              </td>
              <td style="font-weight:bold" bgcolor="#FF0000">
                <xsl:value-of select="curstatus"/>
              </td>
              <td style="font-weight:bold" bgcolor="#FF0000">
                <xsl:value-of select="stablerevision"/>
              </td>
              <td style="font-weight:bold" bgcolor="#FF0000">
                <xsl:value-of select="curdate"/>
              </td>
              <td style="font-weight:bold" bgcolor="#FF0000">
                <xsl:value-of select="prevstatus"/>
              </td>
              <td style="font-weight:bold" bgcolor="#FF0000">
                <xsl:value-of select="prevstable"/>
              </td>
              <td style="font-weight:bold" bgcolor="#FF0000">
                <xsl:value-of select="prevdate"/>
              </td>
            </tr>
            </xsl:for-each>
          </xsl:when>
          <xsl:otherwise>
            <xsl:for-each select="statusfile/job/currentstatus">
              <tr bgcolor="#C1E3E8">
                <td style="font-weight:bold" bgcolor="#2EFE2E">
                  <xsl:value-of select="name"/>
                </td>
                <td style="font-weight:bold" bgcolor="#2EFE2E">
                  <xsl:value-of select="curstatus"/>
                </td>
                <td style="font-weight:bold" bgcolor="#2EFE2E">
                  <xsl:value-of select="stablerevision"/>
                </td>
                <td style="font-weight:bold" bgcolor="#2EFE2E">
                  <xsl:value-of select="curdate"/>
                </td>
                <td style="font-weight:bold" bgcolor="#2EFE2E">
                  <xsl:value-of select="prevstatus"/>
                </td>
                <td style="font-weight:bold" bgcolor="#2EFE2E">
                  <xsl:value-of select="prevstable"/>
                </td>
                <td style="font-weight:bold" bgcolor="#2EFE2E">
                  <xsl:value-of select="prevdate"/>
                </td>
              </tr>
            </xsl:for-each>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each>     
    </table>
  </xsl:template>
</xsl:stylesheet>

但我只得到表名,而不是完整的输出作业名称及其信息。想到我在这里失踪的东西

请帮帮我, 提前谢谢 格利扬

2 个答案:

答案 0 :(得分:1)

这里有几个问题:

  • 测试“curstatus和prevstatus!='SUCCESS'”成功,如果以下两个都是真的
    • 在当前节点
    • 下面存在元素<curstatus>
    • 当前节点下面有一个元素<prevstatus>,其文本值(内容)与'SUCCESS'不同
  • 我猜你所追求的是curstatus或prevstatus不是'SUCCESS'的元素
  • 嵌套for-each查找相对于当前元素的元素,即/ statusfile / job,因此它只匹配 / statusfile / job / statusfile / job / currentstatus,这可能不是你想要的
  • 我会重写这个,为job-element使用一个单独的模板(更像是“xslt-like”)

我会写:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <table width="500px" border="1px" style="text-align:left;font-family:consolas">
            <tr bgcolor="#2EFEF7">
                <td bgcolor="#2EFEF7">
                    <b>JOB-NAME</b>
                </td>
                <td bgcolor="#2EFEF7">
                    <b>CURRENT-STATUS</b>
                </td>
                <td bgcolor="#2EFEF7">
                    <b>REVISION</b>
                </td>
                <td bgcolor="#2EFEF7">
                    <b>DATE</b>
                </td>
                <td bgcolor="#2EFEF7">
                    <b>PREVIOUS-STATUS</b>
                </td>
                <td bgcolor="#2EFEF7">
                    <b>REVISION</b>
                </td>
                <td bgcolor="#2EFEF7">
                    <b>DATE</b>
                </td>
            </tr>
            <apply-templates select="statusfile/job" />
        </table>
    </xsl:template>

    <xsl:template match="job[curstatus != 'SUCCESS' or prevstatus != 'SUCCESS'">
        <tr bgcolor="#C1E3E8">
            <td style="font-weight:bold" bgcolor="#FF0000">
                <xsl:value-of select="name"/>
            </td>
            <td style="font-weight:bold" bgcolor="#FF0000">
                <xsl:value-of select="curstatus"/>
            </td>
            <td style="font-weight:bold" bgcolor="#FF0000">
                <xsl:value-of select="stablerevision"/>
            </td>
            <td style="font-weight:bold" bgcolor="#FF0000">
                <xsl:value-of select="curdate"/>
            </td>
            <td style="font-weight:bold" bgcolor="#FF0000">
                <xsl:value-of select="prevstatus"/>
            </td>
            <td style="font-weight:bold" bgcolor="#FF0000">
                <xsl:value-of select="prevstable"/>
            </td>
            <td style="font-weight:bold" bgcolor="#FF0000">
                <xsl:value-of select="prevdate"/>
            </td>
        </tr>
    </xsl:template>

    <xsl:template match="job[curstatus = 'SUCCESS' and prevstatus = 'SUCCESS'">
        <tr bgcolor="#C1E3E8">
            <td style="font-weight:bold" bgcolor="#2EFE2E">
                <xsl:value-of select="name"/>
            </td>
            <td style="font-weight:bold" bgcolor="#2EFE2E">
                <xsl:value-of select="curstatus"/>
            </td>
            <td style="font-weight:bold" bgcolor="#2EFE2E">
                <xsl:value-of select="stablerevision"/>
            </td>
            <td style="font-weight:bold" bgcolor="#2EFE2E">
                <xsl:value-of select="curdate"/>
            </td>
            <td style="font-weight:bold" bgcolor="#2EFE2E">
                <xsl:value-of select="prevstatus"/>
            </td>
            <td style="font-weight:bold" bgcolor="#2EFE2E">
                <xsl:value-of select="prevstable"/>
            </td>
            <td style="font-weight:bold" bgcolor="#2EFE2E">
                <xsl:value-of select="prevdate"/>
            </td>
        </tr>
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

你的问题很模糊,但你的主要问题是<xsl:for-each select="statusfile/job/currentstatus"> - 我无法理解为什么会这样,那里没有名为currentstatus的元素所以我无法准确确定您需要的输出。

但是,试试这个 - 我刚刚删除了每个<xsl:for-each select="statusfile/job/currentstatus">,它至少会为每个job元素生成一个表格行。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <table width="500px" border="1px" style="text-align:left;font-family:consolas">
            <tr bgcolor="#2EFEF7">
                <td bgcolor="#2EFEF7">
                    <b>JOB-NAME</b>
                </td>
                <td bgcolor="#2EFEF7">
                    <b>CURRENT-STATUS</b>
                </td>
                <td bgcolor="#2EFEF7">
                    <b>REVISION</b>
                </td>
                <td bgcolor="#2EFEF7">
                    <b>DATE</b>
                </td>
                <td bgcolor="#2EFEF7">
                    <b>PREVIOUS-STATUS</b>
                </td>
                <td bgcolor="#2EFEF7">
                    <b>REVISION</b>
                </td>
                <td bgcolor="#2EFEF7">
                    <b>DATE</b>
                </td>
            </tr>
            <xsl:for-each select="statusfile/job">
                <xsl:choose>
                    <xsl:when test="curstatus and prevstatus != 'SUCCESS'">
                        <tr bgcolor="#C1E3E8">
                            <td style="font-weight:bold" bgcolor="#FF0000">
                                <xsl:value-of select="name"/>
                            </td>
                            <td style="font-weight:bold" bgcolor="#FF0000">
                                <xsl:value-of select="curstatus"/>
                            </td>
                            <td style="font-weight:bold" bgcolor="#FF0000">
                                <xsl:value-of select="stablerevision"/>
                            </td>
                            <td style="font-weight:bold" bgcolor="#FF0000">
                                <xsl:value-of select="curdate"/>
                            </td>
                            <td style="font-weight:bold" bgcolor="#FF0000">
                                <xsl:value-of select="prevstatus"/>
                            </td>
                            <td style="font-weight:bold" bgcolor="#FF0000">
                                <xsl:value-of select="prevstable"/>
                            </td>
                            <td style="font-weight:bold" bgcolor="#FF0000">
                                <xsl:value-of select="prevdate"/>
                            </td>
                        </tr>
                    </xsl:when>
                    <xsl:otherwise>
                        <tr bgcolor="#C1E3E8">
                            <td style="font-weight:bold" bgcolor="#2EFE2E">
                                <xsl:value-of select="name"/>
                            </td>
                            <td style="font-weight:bold" bgcolor="#2EFE2E">
                                <xsl:value-of select="curstatus"/>
                            </td>
                            <td style="font-weight:bold" bgcolor="#2EFE2E">
                                <xsl:value-of select="stablerevision"/>
                            </td>
                            <td style="font-weight:bold" bgcolor="#2EFE2E">
                                <xsl:value-of select="curdate"/>
                            </td>
                            <td style="font-weight:bold" bgcolor="#2EFE2E">
                                <xsl:value-of select="prevstatus"/>
                            </td>
                            <td style="font-weight:bold" bgcolor="#2EFE2E">
                                <xsl:value-of select="prevstable"/>
                            </td>
                            <td style="font-weight:bold" bgcolor="#2EFE2E">
                                <xsl:value-of select="prevdate"/>
                            </td>
                        </tr>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each>
        </table>
    </xsl:template>
</xsl:stylesheet>