1

我知道这应该不会太难,但我还是 XSLT 的新手。我有一个 XML 文件,其架构如下:

<xs:element id="ALL_DATA">
    <xs:complexType>
        <xs:element name="INPUT_REPORT">
            <xs:complexType>
                <xs:element name="VALUE_NAME"></xs:element>
                <xs:element name="VALUE_DATE"></xs:element>
                <xs:element name="VALUE_FAME"></xs:element>
                <xs:element name="VALUE_GLORY"></xs:element>
                <xs:element name="VALUE_GOLDEN_STARS"></xs:element>
            </xs:complexType>
        </xs:element>
    </xs:complexType>
</xs:element>

XML 文件看起来像这样(缩写):

<ALL_DATA>
    <INPUT_REPORT>
        <VALUE_NAME>Bob Painter</VALUE_NAME>
        <VALUE_FAME>NOBODY</VALUE_FAME>
    </INPUT_REPORT>
    <INPUT_REPORT>
        <VALUE_NAME>Norman Normal</VALUE_NAME>
        <VALUE_FAME>SOMEBODY</VALUE_FAME>
        <VALUE_GLORY>Sunny</VALUE_GLORY>
        <VALUE_GOLDEN_STAR>SOMEBODY</VALUE_GOLDEN-STAR>
    </INPUT_REPORT>
</ALL_DATA>

棘手的部分是我试图让它像这样显示为 html 表格

VALUE_NAME         Bob Painter Norman Normal
VALUE_DATE
VALUE_FAME         NOBODY      SOMEBODY
VALUE_GLORY                    Sunny
VALUE_GOLDEN_STARS

我找到了一些用于打印默认值的代码,这些代码可以生成空白,但是如果没有任何报告具有该数据,则这无助于我打印该行。有任何想法吗?

<xsl:variable name="show_comments">
  <xsl:choose>
    <xsl:when test="//QUERY_STRING/show_comments"><xsl:value-of select="//QUERY_STRING/show_comments"/></xsl:when>
    <xsl:otherwise>0</xsl:otherwise> <!-- default value -->
  </xsl:choose>
</xsl:variable>
4

2 回答 2

2

即使没有任何报告具有值,以下转换也会打印该行:

<html xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsl:version="2.0">
    <head><title>All data</title></head>
    <body>
        <table>
            <tr>
                <td>VALUE_NAME</td>
                <xsl:for-each select="//INPUT_REPORT">
                    <td><xsl:value-of select="VALUE_NAME"/></td>
                </xsl:for-each>
            </tr>
            <tr>
                <td>VALUE_DATE</td>
                <xsl:for-each select="//INPUT_REPORT">
                    <td>
                        <xsl:choose>
                            <xsl:when test="VALUE_DATE">
                                <xsl:value-of select="VALUE_DATE"/>
                            </xsl:when>
                            <xsl:otherwise>_nodate_</xsl:otherwise>
                        </xsl:choose>
                    </td>
                </xsl:for-each>
            </tr>
            <tr>
                <td>VALUE_FAME</td>
                <xsl:for-each select="//INPUT_REPORT">
                    <td>
                        <xsl:choose>
                            <xsl:when test="VALUE_FAME">
                                <xsl:value-of select="VALUE_FAME"/>
                            </xsl:when>
                            <xsl:otherwise>_nofame_</xsl:otherwise>
                        </xsl:choose>
                    </td>
                </xsl:for-each>
            </tr>
            <tr>
                <td>VALUE_GLORY</td>
                <xsl:for-each select="//INPUT_REPORT">
                    <td>
                        <xsl:choose>
                            <xsl:when test="VALUE_GLORY">
                                <xsl:value-of select="VALUE_GLORY"/>
                            </xsl:when>
                            <xsl:otherwise>_noglory_</xsl:otherwise>
                        </xsl:choose>
                    </td>
                </xsl:for-each>
            </tr>
            <tr>
                <td>VALUE_GOLDEN_STARS</td>
                <xsl:for-each select="//INPUT_REPORT">
                    <td>
                        <xsl:choose>
                            <xsl:when test="VALUE_GOLDEN_STAR">
                                <xsl:value-of select="VALUE_GOLDEN_STAR"/>
                            </xsl:when>
                            <xsl:otherwise>_nostar_</xsl:otherwise>
                        </xsl:choose>
                    </td>
                </xsl:for-each>
            </tr>
        </table>
    </body>
</html>

请注意,我对此 XML 进行了转换:

<?xml version="1.0" encoding="UTF-8"?>
<ALL_DATA>
    <INPUT_REPORT>
        <VALUE_NAME>Bob Painter</VALUE_NAME>
        <VALUE_FAME>NOBODY</VALUE_FAME>
    </INPUT_REPORT>
    <INPUT_REPORT>
        <VALUE_NAME>Norman Normal</VALUE_NAME>
        <VALUE_FAME>SOMEBODY</VALUE_FAME>
        <VALUE_GLORY>Sunny</VALUE_GLORY>
    <VALUE_GOLDEN_STAR>SOMEBODY</VALUE_GOLDEN_STAR>
    </INPUT_REPORT>
</ALL_DATA>

输入包含一些拼写错误,所以我不知道该使用什么。您实际需要的转换应该非常相似。

于 2013-02-16T00:20:18.630 回答
1

以下XSLT 1.0样式表使用与元素匹配的通用模板,INPUT_REPORT并使用参数值来创建第一列并为每个匹配的元素选择适当的子INPUT_REPORT元素。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output method="html" indent="yes"/>
<xsl:template match="ALL_DATA">
    <html>
        <head></head>
        <body>
            <table>
                <tr>
                    <xsl:apply-templates select="INPUT_REPORT">
                        <xsl:with-param name="column" select="'VALUE_NAME'"/>
                    </xsl:apply-templates>
                </tr>
                <tr>
                    <xsl:apply-templates select="INPUT_REPORT">
                        <xsl:with-param name="column" select="'VALUE_DATE'"/>
                    </xsl:apply-templates>
                </tr>
                <tr>
                    <xsl:apply-templates select="INPUT_REPORT">
                        <xsl:with-param name="column" select="'VALUE_FAME'"/>
                    </xsl:apply-templates>
                </tr>
                <tr>
                    <xsl:apply-templates select="INPUT_REPORT">
                        <xsl:with-param name="column" select="'VALUE_GLORY'"/>
                    </xsl:apply-templates>
                </tr>
                <tr>
                    <xsl:apply-templates select="INPUT_REPORT">
                        <xsl:with-param name="column" select="'VALUE_GOLDEN_STARS'"/>
                    </xsl:apply-templates>
                </tr>
            </table>
        </body>
    </html>
</xsl:template>

<xsl:template match="INPUT_REPORT">
    <xsl:param name="column"/>
    <xsl:if test="position()=1">
        <td><xsl:value-of select="$column"/></td>
    </xsl:if>
    <td><xsl:apply-templates select="*[local-name()=$column]"/></td>
</xsl:template>

</xsl:stylesheet>

如果您可以选择 XSLT 2.0,那么这个样式表会更简洁一些:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">
    <xsl:output method="html" indent="yes"/>
<xsl:template match="ALL_DATA">
    <html>
        <head></head>
        <body>
            <table>
                <xsl:variable name="inputReports" select="INPUT_REPORT" />
                <xsl:for-each select="('VALUE_NAME','VALUE_DATE','VALUE_FAME','VALUE_GLORY','VALUE_GOLDEN_STARS')">
                    <tr>
                        <xsl:apply-templates select="$inputReports">
                            <xsl:with-param name="column" select="."/>
                        </xsl:apply-templates>
                    </tr>
                </xsl:for-each>
            </table>
        </body>
    </html>
</xsl:template>

<xsl:template match="INPUT_REPORT">
    <xsl:param name="column"/>
    <xsl:if test="position()=1">
        <td><xsl:value-of select="$column"/></td>
    </xsl:if>
    <td><xsl:apply-templates select="*[local-name()=$column]"/></td>
</xsl:template>

</xsl:stylesheet>

当应用于示例 XML 输入时,它们都产生以下 HTML 输出:

<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
   </head>
   <body>
      <table>
         <tr>
            <td>VALUE_NAME</td>
            <td>Bob Painter</td>
            <td>Norman Normal</td>
         </tr>
         <tr>
            <td>VALUE_DATE</td>
            <td></td>
            <td></td>
         </tr>
         <tr>
            <td>VALUE_FAME</td>
            <td>NOBODY</td>
            <td>SOMEBODY</td>
         </tr>
         <tr>
            <td>VALUE_GLORY</td>
            <td></td>
            <td>Sunny</td>
         </tr>
         <tr>
            <td>VALUE_GOLDEN_STARS</td>
            <td></td>
            <td></td>
         </tr>
      </table>
   </body>
</html>
于 2013-02-16T00:41:45.950 回答