在XSLT 1.0中使用应用模板循环

时间:2014-08-11 13:39:38

标签: xml xslt xslt-1.0

我试图遍历一个有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
...

您能否就如何实现这一点给出一些指示 可以使用应用模板完成吗?

2 个答案:

答案 0 :(得分:1)

假设您需要文本输出,请尝试以下操作:

<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>

答案 1 :(得分:1)

使用纯模式匹配的解决方案

您可以使用模式匹配在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

使用模式匹配而不是循环。