下面将为您的输入样本生成所描述的输出
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:param name="sep" select="','"/>
<xsl:param name="lf" select="' '"/>
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates select="table/columns/column/name"/>
<xsl:value-of select="$lf"/>
<xsl:apply-templates select="table/rows/row"/>
</xsl:template>
<xsl:template match="column/name">
<xsl:value-of select="."/>
<xsl:if test="position() != last()">
<xsl:value-of select="$sep"/>
</xsl:if>
</xsl:template>
<xsl:template match="rows/row">
<xsl:apply-templates select="columns/column"/>
<xsl:value-of select="$lf"/>
</xsl:template>
<xsl:template match="row/columns/column[not(localDate)]">
<xsl:value-of select="value"/>
<xsl:if test="position() != last()">
<xsl:value-of select="$sep"/>
</xsl:if>
</xsl:template>
<xsl:template match="row/columns/column[localDate]">
<xsl:value-of select="localDate"/>
<xsl:if test="position() != last()">
<xsl:value-of select="$sep"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
但它不查看相应的列类型,它只输出localdate元素(如果存在)。够了吗?
还请说明您是否可以使用XSLT2.0(由AltovaXML工具或Saxon9实现),这使得这类工作变得更简单。
[编辑]我想在匹配模式中使用一个键,虽然这在XSLT1.0中是不允许的,但它似乎可以工作的,所以下面是您的需求的更好实现:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:param name="sep" select="','"/>
<xsl:param name="lf" select="' '"/>
<xsl:key name="k1" match="table/columns/column" use="@id"/>
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates select="table/columns/column/name"/>
<xsl:value-of select="$lf"/>
<xsl:apply-templates select="table/rows/row"/>
</xsl:template>
<xsl:template match="column/name">
<xsl:value-of select="."/>
<xsl:if test="position() != last()">
<xsl:value-of select="$sep"/>
</xsl:if>
</xsl:template>
<xsl:template match="rows/row">
<xsl:apply-templates select="columns/column"/>
<xsl:value-of select="$lf"/>
</xsl:template>
<xsl:template match="row/columns/column[not(key('k1', @id)/type = 'Date')]">
<xsl:value-of select="value"/>
<xsl:if test="position() != last()">
<xsl:value-of select="$sep"/>
</xsl:if>
</xsl:template>
<xsl:template match="row/columns/column[key('k1', @id)/type = 'Date']">
<xsl:value-of select="localDate"/>
<xsl:if test="position() != last()">
<xsl:value-of select="$sep"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>