0

したがって、XSL を使用して、Web サービスを介して送信される前に日付をフォーマットしたいと考えていますが、DOB フィールドが空白の場合は空白のままであり、日付が含まれている場合は先に進むことも確認したいと考えています。日付をフォーマットします。

これで、日付をフォーマットするための XSL を取得しました。ただし、空の場合は空のままにするという条件が機能していないようです。

XSL を通過する前の XML:

<BriefDetails>
    <ObjectID>
        <flt:ObjectType>C1</flt:ObjectType>
    </ObjectID>
</BriefDetails>
<Name>
    <Title>Dr</Title>
    <Forename>Paul</Forename>
    <Surname>Smith</Surname>
    <flt:Preferred>true</flt:Preferred>
</Name>
<ContactEmails>
    <EmailAddress>mail@mail.com</EmailAddress>
    <flt:Preferred>true</flt:Preferred>
</ContactEmails>
<DateOfBirth />
<ContactPostals>
    <AddressNumber>34</AddressNumber>
    <AddressLine>Hopeless Road</AddressLine>
    <AddressLine>Maghera</AddressLine>
    <Postcode>BT74 2TY</Postcode>
    <flt:Preferred>true</flt:Preferred>
</ContactPostals>
<ContactPhones>
    <Number>5545454</Number>
    <flt:Preferred>false</flt:Preferred>
</ContactPhones>
<ContactPhones>
    <Number>5454545</Number>
    <flt:Preferred>false</flt:Preferred>
</ContactPhones>

XSL 後の XML:

<BriefDetails>
    <ObjectID>
        <flt:ObjectType>C1</flt:ObjectType>
    </ObjectID>
</BriefDetails>
<Name>
    <Title>Dr</Title>
    <Forename>Paul</Forename>
    <Surname>Smith</Surname>
    <flt:Preferred>true</flt:Preferred>
</Name>
<ContactEmails>
    <EmailAddress>mail@mail.com</EmailAddress>
    <flt:Preferred>true</flt:Preferred>
</ContactEmails>
***<DateOfBirth>--</DateOfBirth>***
<ContactPostals>
    <AddressNumber>34</AddressNumber>
    <AddressLine>Hopeless Road</AddressLine>
    <AddressLine>Maghera</AddressLine>
    <Postcode>BT74 2TY</Postcode>
    <flt:Preferred>true</flt:Preferred>
</ContactPostals>
<ContactPhones>
    <Number>5545454</Number>
    <flt:Preferred>false</flt:Preferred>
</ContactPhones>
<ContactPhones>
    <Number>5454545</Number>
    <flt:Preferred>false</flt:Preferred>
</ContactPhones>

上記のDOBは次のように表示されます-

使用されている XSL:

<xsl:template match="DateOfBirth">
    <xsl:element name="DateOfBirth">
        <xsl:call-template name="formatDate">
            <xsl:with-param name="dateParam" select="." />
        </xsl:call-template>
    </xsl:element>
</xsl:template>

<xsl:template name="formatDate">
    <xsl:param name="dateParam" />
    <!-- input format mm/dd/yyyy or m/d/yyyy -->
    <!-- output format yyyy-mm-dd -->

    <!-- parse out the day, month and year -->
    <xsl:variable name="day">
        <xsl:value-of select="substring-before($dateParam,'/')" />
    </xsl:variable>
    <xsl:variable name="month">
        <xsl:value-of select="substring-before(substring-after($dateParam,'/'),'/')" />
    </xsl:variable>
    <xsl:variable name="year">
        <xsl:value-of select="substring-after(substring-after($dateParam,'/'),'/')" />
    </xsl:variable>

    <!-- now print them out. Pad with 0 where necessary. -->
    <xsl:value-of select="$year" />
    <xsl:value-of select="'-'" />
    <xsl:if test="string-length($month) = 1">
        <xsl:value-of select="'0'" />
    </xsl:if>
    <xsl:value-of select="$month" />
    <xsl:value-of select="'-'" />
    <xsl:if test="string-length($day) = 1">
        <xsl:value-of select="'0'" />
    </xsl:if>
    <xsl:value-of select="$day" />
</xsl:template>

条件を追加してみました:

<xsl:template match="DateOfBirth">
    <xsl:for-each select="DateOfBirth">
        <xsl:if test="string-length(DateOfBirth) != 0">
            <xsl:call-template name="formatDate">
                <xsl:with-param name="dateParam" select="DateOfBirth" />
            </xsl:call-template>
        </xsl:if>
    </xsl:for-each>
</xsl:template>

<xsl:template name="formatDate">
    <xsl:param name="dateParam" />
    <!-- input format mm/dd/yyyy or m/d/yyyy -->
    <!-- output format yyyy-mm-dd -->

    <!-- parse out the day, month and year -->
    <xsl:variable name="day">
        <xsl:value-of select="substring-before($dateParam,'/')" />
    </xsl:variable>
    <xsl:variable name="month">
        <xsl:value-of select="substring-before(substring-after($dateParam,'/'),'/')" />
    </xsl:variable>
    <xsl:variable name="year">
        <xsl:value-of select="substring-after(substring-after($dateParam,'/'),'/')" />
    </xsl:variable>

    <!-- now print them out. Pad with 0 where necessary. -->
    <xsl:value-of select="$year" />
    <xsl:value-of select="'-'" />
    <xsl:if test="string-length($month) = 1">
        <xsl:value-of select="'0'" />
    </xsl:if>
    <xsl:value-of select="$month" />
    <xsl:value-of select="'-'" />
    <xsl:if test="string-length($day) = 1">
        <xsl:value-of select="'0'" />
    </xsl:if>
    <xsl:value-of select="$day" />
</xsl:template>

しかし、これはXMLのDOBを取り除きます

どうすればこれを達成できるかについてのアドバイスはありますか?

4

1 に答える 1

2

問題はIF条件にあります

<xsl:if test="string-length(DateOfBirth) != 0">

この時点ですでにDateOfBirth要素に配置されているため、これは実際には、現在の要素自体の値ではなく、現在の要素でDateOfBirthという子要素を探しています。

<xsl:if test="string-length(.) != 0">

実際には、不要なxsl:for-eachも追加したようです。テンプレートは実際には次のようになります

<xsl:template match="DateOfBirth">
    <DateOfBirth>
        <xsl:if test="string-length(.) != 0">
            <xsl:call-template name="formatDate">
                <xsl:with-param name="dateParam" select="." />
            </xsl:call-template>
        </xsl:if>
    </DateOfBirth>
</xsl:template>

ちなみに、静的要素名にxsl:elementを使用する必要はなく、要素を直接書き出すだけです。

実際、xsl:ifを必要とせずにこれを行う別の方法があります。テンプレート内の条件を一致させることができます

<xsl:template match="DateOfBirth[string-length(.) != 0]">
    <DateOfBirth>
        <xsl:call-template name="formatDate">
             <xsl:with-param name="dateParam" select="." />
        </xsl:call-template>
    </DateOfBirth>
</xsl:template>

<xsl:template match="DateOfBirth">
    <DateOfBirth />
</xsl:template>

XSLTは、より具体的なテンプレートにも最初に一致するため、2番目のテンプレートはDateOfBirthが空の場合にのみ一致します。さらに、XSLTでID変換を使用している場合は、実際には2番目のテンプレートはまったく必要ありません。

于 2012-11-07T09:14:24.223 に答える