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

次のXSLT1.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 に答える