XSLT:如何申请for循环?

时间:2017-02-01 08:26:33

标签: jquery xml xslt xslt-1.0

您能告诉我如何在XSLT中应用for循环吗?

这是我的live code at xsltransform.net

XML:

<?xml version="1.0" encoding="UTF-8"?>
<body>
    <h1>A new version of xsltransform.net is released!</h1>
    <p>We have added the following new features:</p>
    <ul>
        <li>A new XSLT engine is added: Saxon 9.5 EE, with a license (thank you Michael Kay!)</li>
        <li>XSLT 3.0 support when using the new Saxon 9.5 EE engine!</li>
        <li>Preview your result as HTML when doctype is set to HTML (see this example)</li>
        <li>Preview your result as PDF when doctype is set to XML and your document starts with root element of XSL-FO. Apache FOP is used to generate the PDF</li>
        <li>Added some links to useful XSLT sites</li>
    </ul>
</body>

我的XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="test" select="'ss'"/>
    <xsl:variable name="inline-array">
        <Item>A</Item>
        <Item>B</Item>
        <Item>C</Item>
    </xsl:variable>

    <xsl:param name="array" select="document('')/*/xsl:variable[@name='inline-array']/*"/>

    <xsl:template match="/">
      <xsl:for-each select="$inline-array">
          <h1><xsl:value-of select="."/></h1>
      </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

预期输出

<h1>A</h1>
<h1>B</h1>
<h1>C</h1>

3 个答案:

答案 0 :(得分:3)

只需为for-each添加另一个item

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="test" select="'ss'"/>
    <xsl:variable name="inline-array">
        <Item>A</Item>
        <Item>B</Item>
        <Item>C</Item>
    </xsl:variable>

    <xsl:param name="array" select="document('')/*/xsl:variable[@name='inline-array']/*"/>

    <xsl:template match="/">
      <xsl:for-each select="$inline-array">
        <xsl:for-each select="Item"> //<--Added this line
          <h1><xsl:value-of select="."/></h1>     
        </xsl:for-each>  //<--Added this line too
      </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

<强>输出:

<?xml version="1.0" encoding="UTF-8"?><h1>A</h1><h1>B</h1><h1>C</h1>

Demo

答案 1 :(得分:2)

在XSLT 1.0中,您的inline-array变量包含&#34;结果树片段&#34;,因此要访问其中的节点,您需要使用&#34; node-set& #34;扩展功能。

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:exsl="http://exslt.org/common"
    extension-element-prefixes="exsl">

    <xsl:variable name="inline-array">
        <Item>A</Item>
        <Item>B</Item>
        <Item>C</Item>
    </xsl:variable>

    <xsl:template match="/">
      <xsl:for-each select="exsl:node-set($inline-array)/Item">
        <h1><xsl:value-of select="."/></h1>
      </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

另请注意,您也可以使用document函数,因为您已经包含在样本中,但我相信XSLTransform.net不允许使用文档函数,因此您可以&#39 ; t测试它,但这应该在本地运行

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="array" select="document('')//xsl:variable[@name='inline-array']/*"/>

    <xsl:variable name="inline-array">
        <Item>A</Item>
        <Item>B</Item>
        <Item>C</Item>
    </xsl:variable>

    <xsl:template match="/">
        <xsl:for-each select="$array">
            <h1>
                <xsl:value-of select="."/>
            </h1>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

答案 2 :(得分:0)

创建和访问<xsl:variable>的替代方法是使用某种&#34;数据岛&#34;在您的XSLT文件中。

这种方法的一个主要优点是您不必处理RTF(结果树片段),因此您可以根据需要查询XML。

它的创建只需为它定义一个命名空间(这里:xmlns:items="http://ite.ms"),然后通过document('')/xsl:stylesheet/namespace:... XPath访问它。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:items="http://ite.ms" >

    <!-- kind of "data-island" -->
    <items:Items>    
        <Item>A</Item>
        <Item>B</Item>
        <Item>C</Item>   
    </items:Items>    

    <xsl:template match="/">
      <xsl:for-each select="document('')/xsl:stylesheet/items:Items/Item">
        <h1><xsl:value-of select="text()" /></h1><xsl:text>&#xa;</xsl:text>
      </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

我更喜欢这种方式,因为恕我直言,它是在XSLT中嵌入XML数据最干净的方法。

<强>输出:

<?xml version="1.0"?>
<h1>A</h1>
<h1>B</h1>
<h1>C</h1>