我们可以在XSLT中创建一个序列吗?

时间:2013-04-06 05:57:41

标签: xslt

我正在使用xslt生成一个文本文件。当我传递xml输入时,xslt将xml输入转换为文本file.can我们为每次调用提供序列号。

并将其存储在某个变量中。

1)如果第一次执行假设创建了一个文本文件,那么xslt(<sequence>)中有一个变量,它应该分配为数字1,如下所示

<sequence>1</sequence>

2)第二次执行时会再创建一个文本文件,因此序列变量应该增加。

<sequence>2<sequence>

3)第三次执行时会再创建一个文本文件,因此序列就像这样

<sequence>3</sequence>

我们通常可以通过在oracle数据库中创建一个序列并在xslt中调用该序列来执行此操作,并且对于每次执行,序列都会增加

<sequence>CallOracleSequence</sequence>

任何人都可以建议不要使用Oracle sequence.can我们在xslt中处理这个。

3 个答案:

答案 0 :(得分:0)

通常,序列号与输入中的某些内容相关,因此您可以使用position()xsl:number。但细节取决于输入的结构。

答案 1 :(得分:0)

XSLT不会在执行变换之间保持状态。

一种选择是利用包含序列号的外部配置文件。使用实体引用,您可以使XSLT文档的XML配置部分读取它的当前值,并在XSLT执行时,递增数字并使用<xsl:result-document>使用新的序列号覆盖配置文件。

下面是一个 XSLT 2.0 样式表的工作示例,它假设在与正在执行的XSLT相同的目录中有一个名为sequence.xml的序列文件:

<?xml version="1.0" encoding="UTF-8"?>
<!--delare entities to reference the sequence file-->
<!DOCTYPE xsl:stylesheet [
<!ENTITY sequenceFile SYSTEM "sequence.xml">
]>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:output name="sequenceOutput" method="xml" indent="yes"/> 

  <!--this variable is used to store the expanded entity reference for 
      the current sequence.xml file
    When the XSLT is parsed it will "look" like this to the XML parser:
    <xsl:variable name="sequence><sequence>1</sequence></xsl:variable>
  -->
    <xsl:variable name="sequence">
        <!--
        this entity reference will expand to: 
            <sequence>x</sequence> 
        when the XSLT is parsed
        -->
        &sequenceFile;
    </xsl:variable>
   <!--
    Use the document() function with an empty value to read the XSLT 
    and then parse the sequence value produced by the entity reference
   -->
    <xsl:variable name="currentSequenceValue" 
      select="number(document('')/*/xsl:variable[@name='sequence']/sequence)"/>

    <xsl:template match="/">
        <!--do normal processing of the XML document-->
        <xsl:apply-templates />

        <!--
        This will overwrite the sequence file with the incremented value
        -->
        <xsl:result-document format="sequenceOutput" href="sequence.xml">
          <sequence><xsl:value-of select="$currentSequenceValue+1"/></sequence>
        </xsl:result-document>

    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

答案 2 :(得分:0)

通过写出两个文件 - 转换的结果和更新的执行次数,可以通过单个XSLT 2.0转换实现这一目的:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vRepetitions" select=
   "document('file:///c:/temp/delete/numberOfRepetitions.xml')/* +1"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="/">
     <xsl:result-document
        href="file:///c:/temp/delete/iteration{$vRepetitions}.xml">
       <xsl:apply-templates/>
     </xsl:result-document>

     <xsl:result-document href="file:///c:/temp/delete/numberOfRepetitions.xml">
      <n><xsl:value-of select="$vRepetitions"/></n>
     </xsl:result-document>
 </xsl:template>
</xsl:stylesheet>

涉及两个文件:源XML文档和包含当前执行次数的文件 - 后者必须最初创建为包含

<n>0</n>

当上述转换应用于任何源XML文档时(对于此演示,它只对其应用标识规则),它会执行常规处理并生成所需结果。此外,转换将读取包含当前执行数量的XML文档并更新此编号,并将更新的(执行次数)文档写回磁盘:

Saxon 9.1.0.5J from Saxonica
Java version 1.6.0_31
Stylesheet compilation time: 625 milliseconds
Processing file:/C:/Program%20Files/Java/jre6/bin/marrowtr.xml
Building tree for file:/C:/Program%20Files/Java/jre6/bin/marrowtr.xml using class net.sf.saxon.tinytree.TinyBuilder
Tree built in 16 milliseconds
Tree size: 4 nodes, 4 characters, 0 attributes
Loading net.sf.saxon.event.MessageEmitter
Building tree for file:///c:/temp/delete/numberOfRepetitions.xml using class net.sf.saxon.tinytree.TinyBuilder
Tree built in 0 milliseconds
Tree size: 4 nodes, 1 characters, 0 attributes

Writing to file:/c:/temp/delete/iteration2.xml
Writing to file:/c:/temp/delete/numberOfRepetitions.xml

Execution time: 140 milliseconds
Memory used: 11477344
NamePool contents: 16 entries in 16 chains. 6 prefixes, 7 URIs

在这里,我们看到在第二次执行时,转换会创建两个文件

  1. iteration2.xml包含第二次执行转换的结果。

  2. numberOfRepetitions.xml如果我们检查这个文件,第二次执行后的内容是预期的:

  3. 。 。 。

    <n>2</n>