我正在尝试遍历一个有20个元素的xml
<?xml version="1.0" encoding="UTF-8"?>
<container>
<products>one</products>
<products>two</products>
<products>three</products>
<products>four</products>
<products>five</products>
<products>six</products>
<products>seven</products>
<products>eight</products>
...
</container>
我试图通过在每4个元素后插入一个换行符来循环元素
输出要求:
one two three four
five six seven eight
...
你能就如何做到这一点给出一些建议吗这可以使用apply模板来完成吗?
假设您想要文本输出,请尝试如下操作:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/">
<xsl:for-each select="container/products">
<xsl:value-of select="." />
<xsl:choose>
<xsl:when test="position() mod 4">
<xsl:text> </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text> </xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
使用纯模式匹配的解决方案
在XSLT中使用模式匹配可以更自然地获得想要的结果,而不需要循环。
这个XSLT转换:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output method="text"/>
<xsl:template match="products">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="products[position() mod 4 = 0]">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
应用于这个输入XML:
<?xml version="1.0" encoding="UTF-8"?>
<container>
<products>one</products>
<products>two</products>
<products>three</products>
<products>four</products>
<products>five</products>
<products>six</products>
<products>seven</products>
<products>eight</products>
</container>
将产生期望的输出:
one two three four
five six seven eight
使用模式匹配而不是循环