2

これは私のxmlです

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>

<products>
    <product_id value=" 1 ">
        <tab_id value=" 51 ">
            <tab_name value=" test1 "/>
            <status value=" 2 "/>
            <log value=" 5748 , 5749 , 128 "/>
            <born_from value=" 1980-08-01 , 1989-02-01 "/>
            <born_to value=" 1985-08-01 , 1998-02-01 "/>
            <sex value=" 2 , 1 "/>
            <link value=" www.google.com "/>
        </tab_id>
    </product_id>
    <product_id value=" 2 ">
        <tab_id value=" 52 ">
            <tab_name value=" test2 "/>
            <status value=" 3 "/>
            <log value=" 458 , 912 , 333 "/>
            <registration value=" 2013-01-01 "/>
            <born_from value=" 1995-01-25 , 1993-08-03 "/>
            <born_to value=" 2000-01-25 , 2002-10-25 "/>
            <sex value=" 1 , 1 "/>
            <link value=" www.yahoo.com "/>
            <label value=" open "/>
        </tab_id>
    </product_id>
    <product_id value=" 3 ">
        <tab_id value=" 54 ">
            <tab_name value=" test3 "/>
            <status value=" start "/>
            <venue value=" US "/>
            <born_from value=" 2000-01-01 , 2002-02-01 "/>
            <born_to value=" 2005-01-01 , 2003-01-01 "/>
            <sex value=" 1 , 2 "/>
            <link value=" www.facebook.com "/>
        </tab_id>
    </product_id>
 </products>

my_date私は、変数がborn_fromとborn_toの日付と比較し、製品1と2の出力データを与える製品のすべてのデータを表示するために、このXSLTコードを書きました

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes"/>
    <xsl:param name="my_date" select="'1992-01-01'"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/products" priority="1">
        <html>
            <body>
                <table border="1">
                    <tr>
                        <th>Product ID</th>
                        <th colspan="2">Product DATA</th>
                    </tr>
                    <xsl:apply-templates select="product_id/tab_id/born_from[@value &gt; $my_date] | product_id/tab_id/born_to[@value &lt; $my_date]"/>
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="product_id/tab_id">
        <tr>
            <td>
                <xsl:value-of select="product_id"/>
            </td>
            <td><xsl:value-of select="name(*[1])"/> --></td> 
            <td><xsl:value-of select="*[1]/*[1]"/></td>
        </tr>
        <xsl:apply-templates select="*[not(self::product_id)]"/>
    </xsl:template>

    <!--These 2 templates will handle the data on the same
    row as the tab name.-->
    <xsl:template match="product_id/tab_id/*[1]" priority="1">
        <xsl:apply-templates mode="newrow"/>
    </xsl:template>
    <xsl:template match="product_id/tab_id/*[1]/*[1]" mode="newrow"/>

    <xsl:template match="*" mode="newrow">
        <xsl:call-template name="dataRow"/>
    </xsl:template>

    <xsl:template match="product_id/tab_id/*/*[not(position()=1)]">
        <xsl:call-template name="dataRow"/>
    </xsl:template>

    <xsl:template name="dataRow">
        <tr>
            <td/>
            <td/>
            <td><xsl:value-of select="."/></td>
        </tr>       
    </xsl:template>

    <xsl:template match="*[not(self::node)]">
        <tr>
            <td/>
            <td><xsl:value-of select="name()"/> --></td>
            <td><xsl:apply-templates/></td>
        </tr>
    </xsl:template>

</xsl:stylesheet>

私はこれまでの比較の初心者で、何か問題があります

単純my_dateにこのように比較します

 for product 1
1980-08-01 > my_date && my_date < 1985-08-01
1989-02-01 > my_date && my_date < 1998-02-01

 for product 2 
1995-01-25 > my_date && my_date < 2000-01-25
1993-08-03 > my_date && my_date < 2002-10-25

same for product 3

ここmy_dateで、最初の値と2番目の値の両方と比較します..ここで問題はコンマ区切りの値だと思います

私はこのような私の出力が欲しい

Product ID  |   Product DATA
--------------------------------
1           |product_id  => 1
            |tab_id      => 51
            |tab_name    => test1
            |status      => 2
            |log         => 72
            |               19
            |               79
            |born_from   => 1980-08-01
            |               1989-02-01
            |born_to     => 1985-08-01
            |               1998-02-01
            |sex         => 2
            |               1
            |link        => www.google.com

製品 2 についても同様であり、その値は事前に感謝します

4

1 に答える 1

3

日付について話す前に、 xsl:apply-templatesには別の問題があることに注意してください。

<xsl:apply-templates select="product_id/tab_id/born_from[@value &gt; $my_date]" />

これはborn_from要素を選択しますが、一致するテンプレートを見ると、実際にはtab_id要素を選択したいように見えるので、次のように書き直す必要があります:

<xsl:apply-templates select="product_id/tab_id[born_from/@value &gt; $my_date]" />

ただし、コメントで述べたように、XSLT 1.0 には組み込みの日付サポートはありません。XSLT 2.0 を使用するには、拡張関数を使用するか、アップグレードする必要があります。

ただし、日付が常に YYYY-MM-DD 形式になる場合は、ハイフンを削除して 8 桁の数字として扱うことで、単純な数値比較を行うことができます。

まず、 my_dateパラメータを YYYYMMDD 形式の数値に変換する変数を作成します。

<xsl:variable name="comp_date" select="translate($my_date, '- ', '')" />

次に、後続のxsl:apply-templatesをこれに変更してみてください。

<xsl:apply-templates select="
product_id/tab_id[translate(substring-before(born_from/@value, ','), '- ', '') &gt; $comp_date]| 
product_id/tab_id[translate(substring-before(born_to/@value, ','), '- ', '') &lt; $comp_date]"/>

@value属性のカンマの前の最初の日付のみを抽出するためにsubstring-beforeを使用していることに注意してください。コンマの後の日付も確認したい場合は、substring-afterを使用します。

于 2013-03-05T08:56:50.017 に答える