我正在使用xslt从xml文件创建csv。我实际使用的xml文档是巨大的,但我遇到了一个问题并在下面有一个简化的例子。
我正在尝试创建类似这样的东西
项目1,项目2,项目3,项目4,项目5,
1,2,3 ,,,
1,2,3,4 ,,
1,2,3,4,5,
1,2 ,,,,
我的最高项目数是我需要多少列名。 然后,我将需要每个项目组打印出它的值,并且还要继续迭代并插入空值,直到最高计数。我需要这样做,因为我不知道我将拥有一个组中有多少项,所以我想最终创建一个具有最高项目数的db表...它令人困惑和困难,这就是为什么我需要帮忙。
我的xml
<example>
<items>
<item>1</item>
<item>2</item>
<item>3</item>
</items>
<items>
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
</items>
<items>
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
</items>
<items>
<item>1</item>
<item>2</item>
</items>
我的xslt
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/" name="test">
<xsl:for-each select="example/items">
<xsl:sort select="count(item)" data-type="number" order="descending"/>
<xsl:if test="position() = 1">
<xsl:value-of select="count(item)"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
到目前为止,我已经能够获得所有组中最高计数的数量,即5。我可以使用这个数字来生成剩余的输出吗?
非常感谢任何帮助:)
答案 0 :(得分:1)
以这种方式试试吗?
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:variable name="maxCount">
<xsl:for-each select="/example/items">
<xsl:sort select="count(item)" data-type="number" order="descending"/>
<xsl:if test="position()=1">
<xsl:value-of select="count(item)"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="maxItems" select="/example/items[count(item)=$maxCount][1]" />
<xsl:template match="/">
<!-- header -->
<xsl:for-each select="$maxItems/item">
<xsl:text>Item</xsl:text>
<xsl:value-of select="position()"/>
<xsl:text>,</xsl:text>
</xsl:for-each>
<xsl:text> </xsl:text>
<!-- rows -->
<xsl:for-each select="example/items">
<xsl:variable name="this" select="."/>
<xsl:for-each select="$maxItems/item">
<xsl:variable name="i" select="position()"/>
<xsl:value-of select="$this/item[$i]"/>
<xsl:text>,</xsl:text>
</xsl:for-each>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
或者,如果您愿意:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:variable name="maxCount">
<xsl:for-each select="/example/items">
<xsl:sort select="count(item)" data-type="number" order="descending"/>
<xsl:if test="position()=1">
<xsl:value-of select="count(item)"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:template match="/">
<!-- header -->
<xsl:call-template name="header"/>
<xsl:text> </xsl:text>
<!-- rows -->
<xsl:for-each select="example/items">
<xsl:call-template name="row"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
<xsl:template name="header">
<xsl:param name="i" select="1"/>
<xsl:if test="$i <= $maxCount">
<xsl:text>Item</xsl:text>
<xsl:value-of select="$i"/>
<xsl:text>,</xsl:text>
<!-- recursive call -->
<xsl:call-template name="header">
<xsl:with-param name="i" select="$i + 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name="row">
<xsl:param name="i" select="1"/>
<xsl:if test="$i <= $maxCount">
<xsl:value-of select="item[$i]"/>
<xsl:text>,</xsl:text>
<!-- recursive call -->
<xsl:call-template name="row">
<xsl:with-param name="i" select="$i + 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>