循环使用XSLT 1.0中的apply模板



我正在尝试遍历一个有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>&#10;</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>&#10;</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

使用模式匹配而不是循环

相关内容

  • 没有找到相关文章

最新更新