我正在使用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中处理这个。
答案 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
在这里,我们看到在第二次执行时,转换会创建两个文件:
iteration2.xml
包含第二次执行转换的结果。
numberOfRepetitions.xml
如果我们检查这个文件,第二次执行后的内容是预期的:
。 。 。
<n>2</n>