xslt基于前一个元素的下一个元素值

时间:2015-10-07 09:56:32

标签: xml xslt-2.0

我有以下XMl。我想根据类型值读取开始和结束日期。当类型是" O"然后读取O的开始和结束日期,对于类型" L"同样读取。日期是可选的。

     <Person id="1">
        <Date>
            <Type value="O"/>
            <Start value="2009-04-01"/>
            <End value="2012-03-31"/>
        </Date>
        <Date>
            <Type value="L"/>
            <Start value="2009-01-31"/>
        </Date>
        </Person>
        <Person id="2">
        <Date>
            <Type value="O"/>
            <Start value="2009-01-11"/>
        </Date>
        </Person>

我有以下XSLT代码。但它正在阅读和梳理两者中存在的开始/结束日期。

    <xsl:choose>
    <xsl:when test="Date/Type[@value = 'O']">
        <xsl:value-of select="Date/Start/@value"/><xsl:value-of select="$separator" />
        <xsl:value-of select="Date/End/@value"/><xsl:value-of select="$separator" />
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="$separator" /><xsl:value-of select="$separator" />
    </xsl:otherwise>
</xsl:choose>
        <xsl:choose>
    <xsl:when test="Date/Type[@value = 'L']">
        <xsl:value-of select="Date/Start/@value"/><xsl:value-of select="$separator" />
        <xsl:value-of select="Date/End/@value"/><xsl:value-of select="$separator" />
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="$separator" /><xsl:value-of select="$separator" />
    </xsl:otherwise>
</xsl:choose> 

欲望输出是csv

    "2009-04-01","2012-03-31","2009-01-31",""
    "2009-01-11","","",""

1 个答案:

答案 0 :(得分:1)

试试这个XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:strip-space elements="*"/>
    <xsl:output method="text"/>

    <xsl:template match="/">
        <xsl:for-each select="root/Person">
            <xsl:if test="position() &gt; 1">
                <xsl:text>&#xA;</xsl:text>
            </xsl:if>
            <xsl:choose>
                <xsl:when test="Date[Type[@value='O']]">
                    <xsl:apply-templates select="Date[Type[@value='O']]"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:text>&quot;&quot;,&quot;&quot;</xsl:text>
                </xsl:otherwise>
            </xsl:choose>
            <xsl:choose>
                <xsl:when test="Date[Type[@value='L']]">
                    <xsl:apply-templates select="Date[Type[@value='L']]"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:text>,&quot;&quot;,&quot;&quot;</xsl:text>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="root/Person/Date[Type[@value='O']]">
        <xsl:value-of select="if (Start) then concat('&quot;', Start/@value, '&quot;') else concat('&quot;', '&quot;')"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="if (End) then concat('&quot;', End/@value, '&quot;') else concat('&quot;', '&quot;')"/>
    </xsl:template>

    <xsl:template match="root/Person/Date[Type[@value='L']]">
        <xsl:text>,</xsl:text>
        <xsl:value-of select="if (Start) then concat('&quot;', Start/@value, '&quot;') else concat('&quot;', '&quot;')"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="if (End) then concat('&quot;', End/@value, '&quot;') else concat('&quot;', '&quot;')"/>
    </xsl:template>

</xsl:stylesheet>