2013-04-06 3 views
2

Я генерирую текстовый файл, используя xslt.when я передаю вход xml, xslt преобразует вход xml как текстовый файл. Можно указать порядковый номер для каждого вызова.Можем ли мы создать последовательность в XSLT?

и хранить его в некоторой переменной.

1) Если предположить, впервые создается исполнение один текстовый файл, так что переменная внутри XSLT (<sequence>) следует назначать как номер 1, как показано ниже

<sequence>1</sequence> 

2) во второй раз выполняется создание еще одного текстового файла, поэтому переменная последовательности должна увеличиваться.

<sequence>2<sequence> 

3) для выполнения третьего времени еще один текстовый файл, созданный таким образом, последовательность становится как этот

<sequence>3</sequence> 

Это вещь, которую мы можем, как правило, путем создания последовательности в базе данных оракула и называют эту последовательность внутри и XSLT для каждого выполнения последовательности получить увеличилось

<sequence>CallOracleSequence</sequence> 

может кто-нибудь пожалуйста, предложите с помощью Oracle отказа sequence.can мы справиться с этим внутри XSLT.

+0

Это можно сделать с помощью XSLT 2.0. Вас интересует решение XSLT 2.0? –

+0

@ Dimitre да, пожалуйста, предложите решение XSLT 2.0 – sum

+0

sum, см. Мой ответ. Надеюсь, это будет то же самое или близко к тому, что вы хотите. –

ответ

0

XSLT не будет поддерживать состояние между выполнением преобразований.

Одним из вариантов было бы использовать внешний файл конфигурации, содержащий порядковый номер. Используя ссылку на сущность, вы можете сделать эту XML-конфигурационную часть документа XSLT для чтения текущего значения, а когда XSLT выполнит, увеличьте число и перезапишите конфигурационный файл с новым порядковым номером с помощью <xsl:result-document>.

Ниже приведен рабочий пример XSLT 2.0 стилей, предполагающих есть файл последовательность называется sequence.xml в той же директории, как XSLT выполняется:

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

Обычно порядковый номер будет относиться к чему-то на входе, поэтому вы можете использовать position() или xsl:number. Но детали зависят от структуры ввода.

+0

Я говорю о выполнении всего процесса (xslt), а не в xslt для первой итерационной позиции() = 1 и для второго итерационного положения() = 2 и для третьей позиции итерации() = 3 не так, как – sum

+1

Тогда передать параметр в таблицу стилей из вызывающего приложения. –

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, содержащий текущее число executuions и обновляет этот номер и записывает обновленное (количество выполнений) документ на диск:

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 Если мы рассмотрим этот файл, его содержимое после второй исполнение, как и ожидалось:

. , , ,

<n>2</n> 
+0

Dimitre, причина, по которой я использовал ссылку на сущность в моем ответе, состояла в том, чтобы избежать ошибки «Невозможно записать в URI, который был прочитан» http://www.w3.org/TR/xslt20/#err-XTRE1500, который я получаю при выполнении вашей таблицы стилей, потому что вы используете функцию document() для загрузки файла, а затем пытаетесь записать его с помощью ''. Загрузка файла «numberOfRepetitions.xml» через внешний обработанный объект обходит это ограничение. Как вы избежали ошибки при запуске? –

+0

@MadsHansen, Да, без ошибок - я предоставил все данные от Saxon 9.1.0.5J –

Смежные вопросы