我有以下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","","",""
答案 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() > 1">
<xsl:text>
</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>"",""</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>,"",""</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('"', Start/@value, '"') else concat('"', '"')"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="if (End) then concat('"', End/@value, '"') else concat('"', '"')"/>
</xsl:template>
<xsl:template match="root/Person/Date[Type[@value='L']]">
<xsl:text>,</xsl:text>
<xsl:value-of select="if (Start) then concat('"', Start/@value, '"') else concat('"', '"')"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="if (End) then concat('"', End/@value, '"') else concat('"', '"')"/>
</xsl:template>
</xsl:stylesheet>