9

私のデータモデルは次のとおりです。

<Club>
<Captain>
<Name></Name>
<DateOfBirth>15-01-1985</DateOfBirth>
</Captain>
<PlayingStaff>
<Player>
<DateOfBirth>14-01-1993</DateOfBirth>
</Player>
<Player>
<DateOfBirth>07-12-1975</DateOfBirth>
</Player>
<Player>
<DateOfBirth>11-11-1991</DateOfBirth>
</Player>
</PlayingStaff>
</Club>

ここにある回答を使用してみました: XSLT: 最新の日付を取得していますが、価値はありません。

最年少のプレーヤーを外部関数に渡そうとしています。

私はBiztalkでこれをやっているので、XSLT1に固執する必要があります

これまでの私の仕事は次のとおりです。

<xsl:variable name="youngestPlayer">
            <xsl:for-each select="$ClubRoot/*[local-name()='PlayingStaff']/*[local-name()='Player']">
                <xsl:sort select="./*[local-name()='DateOfBirth']" order="descending"/>
                <xsl:if test="position() = 1">
                    <xsl:value-of select="DateOfBirth"/>
                </xsl:if>
            </xsl:for-each>
        </xsl:variable>
        <xsl:variable name="IsYoungestPlayerUnderAgeLimit" select="externalfunctionreturningboolean">
            <xsl:element name="blahhh"><xsl:value-of select="$IsYoungestPlayerUnderAgeLimit"/></xsl:element>
            <xsl:element name="blahhh"><xsl:value-of select="$youngestPlayer"/></xsl:element>

これは大きなテンプレートの一部です。これを実際に変更することはできませんが、ClubRoot の値は「<xsl:variable name="ClubRoot" select="/*[1]"/>"その子ノードを確実に読み取れるようにするためです。

私はいつも得ています

<blahhh>false</blahhh>
<blahhh/> 

私のデバッグ値として...だから私は期待する値を拾っていません

誰かが私が間違っている場所を強調できますか?

上記のデータから、youngestPlayer 変数の値は 14-01-1993 であると予想されます。しかし、それは空白です。

4

2 に答える 2

7

問題は、XSLT1.0には実際には日付の概念がないため、DateOfBirth要素を通常の文字列であるかのように効果的に並べ替えていることです。日付が常にDD-MM-YYYYの形式であることが確実な場合は、文字列操作を使用して、年、月、日で並べ替えることができます。

<xsl:sort select="number(substring(DateOfBirth, 7, 4))" order="descending"/>
<xsl:sort select="number(substring(DateOfBirth, 3, 2))" order="descending"/>
<xsl:sort select="number(substring(DateOfBirth, 1, 2))" order="descending"/>

したがって、次のXSLTが与えられます

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:template match="/Club">
      <xsl:for-each select="PlayingStaff/Player">
         <xsl:sort select="number(substring(DateOfBirth, 7, 4))" order="descending"/>
         <xsl:sort select="number(substring(DateOfBirth, 3, 2))" order="descending"/>
         <xsl:sort select="number(substring(DateOfBirth, 1, 2))" order="descending"/>

         <xsl:if test="position() = 1">
            <xsl:value-of select="DateOfBirth"/>
         </xsl:if>
      </xsl:for-each>
   </xsl:template>
</xsl:stylesheet>

XMLに適用すると、次のように出力されます。

14-01-1993
于 2012-10-01T15:52:05.487 に答える