如何在具有相似名称的多个文件中以编程方式迭代XSLT

时间:2013-09-06 07:56:00

标签: xslt

A有以下xmls:

data_0.xml data_1.xml data_3.xml 等等...

在xslt文件中我想迭代所有文件,所以我尝试了 - 每个函数。

<xsl:for-each select="document('data.xml')/*">

如何迭代所有这些?不知何故添加面具?这当然行不通:

<xsl:for-each select="document('data_*.xml')/*">

1 个答案:

答案 0 :(得分:0)

以下是xslt 1.0中的解决方案:

我的文件系统中有四个文件:

<强> Doc1.xml:

<p>Doc1</p>

<强> Doc2.xml:

<p>Doc2</p>

<强> Doc3.xml:

<p>Doc3</p>

<强> Doc4.xml:

<p>Doc4</p>

xslt 获取输出结果为:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">


  <xsl:template match="/">
    <Root>
      <xsl:call-template name="getDocuments"/>
    </Root>
  </xsl:template>

<xsl:template name="getDocuments">
  <xsl:param name="fileStartWith" select="'Doc'"/>
  <xsl:param name="endCounter">4</xsl:param>
  <xsl:param name="startCounter">1</xsl:param>
  <xsl:choose>
    <xsl:when test="$endCounter > 0">
      <xsl:variable name="fileName"><xsl:value-of select="concat($fileStartWith,$startCounter,'.xml')"/></xsl:variable>
      <xsl:for-each select="document($fileName)/*">
        <xsl:copy-of select="."/><xsl:text>&#10;</xsl:text>
      </xsl:for-each>
      <xsl:call-template name="getDocuments">
        <xsl:with-param name="startCounter" select="$startCounter + 1"/>
        <xsl:with-param name="fileStartWith" select="$fileStartWith"/>
        <xsl:with-param name="endCounter" select="$endCounter - 1"/>
      </xsl:call-template>
    </xsl:when>
  </xsl:choose>

</xsl:template>

</xsl:stylesheet>

生成的输出是:

<Root>
<p>Doc1</p>
<p>Doc2</p>
<p>Doc3</p>
<p>Doc4</p>
</Root>

请确保xslt和xml位于同一路径上,否则您需要更改文档功能的内容。