2009-03-11 4 views
3

Привет,Инлайн Выбор выходного документа с использованием результата документ в XSLT 2.0

Я ищу способ, чтобы сделать в линии результат (выход) документ, выбрав в XSLT. Я знаю метод, в котором создается узел xsl:result-document, чтобы одно преобразование применимо к нескольким документам. Обычно этот метод используется несколько проходов, таких как:

<xsl:template match="/"> 
    <xsl:apply-templates select="*"/> 
    <xsl:result-document href="test.xml"> 
     <xsl:apply-templates select="*"/> 
    </xsl:result-document> 
</xsl:template> 

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

<xsl:variable name="treeBase"> 
    <Base/> 
</xsl:variable> 

<xsl:template match="/"> 
    <xsl:apply-templates select="*"/> 
</xsl:template> 

<xsl:template match="these_elements"> 
    <xsl:param name="temp" select="$treeBase"/> 


</xsl:template> 

<xsl:template match="not_these_elements"> 
    <xsl:param name="temp" select="$treeBase"/> 

    <xsl:apply-templates select="@*|node()"> 
     <xsl:with-param name="temp"> 
      <Base> 
       <xsl:copy-of select="$temp/Base/*"/> 
       <Item> 
        <xsl:value-of select="ThisItem"/> 
       </Item> 
      </Base> 
     </xsl:with-param> 
</xsl:template> 

Зачем вам это нужно? В моем XSLT я создаю временное дерево через рекурсивные вызовы параметров. Я хочу вывести временное дерево, поскольку оно создается для отдельного документа, но все же использует временное дерево, созданное для потока управления. С помощью текущего метода мне пришлось бы выполнить сложное преобразование дважды.

Есть ли способ сделать это в XSLT или это однопроходный, только один документ?

Заранее спасибо.

ответ

1

Вот рабочий пример, как это сделать:

Это преобразование:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <!--            -->  
    <xsl:template match="/*"> 
     <xsl:variable name="vTop" select="."/> 
    <!--            -->  
     <xsl:for-each-group select="num" group-by="xs:integer(.) mod 2"> 
      <xsl:result-document href="file:///C:/Temp/file{position()}.xml"> 
      <xsl:element name="{name($vTop)}"> 
       <xsl:copy-of select="current-group()"/> 
      </xsl:element> 
      </xsl:result-document> 
     </xsl:for-each-group> 
    </xsl:template> 
</xsl:stylesheet> 

при нанесении на этом XML-документ

<nums> 
    <num>01</num> 
    <num>02</num> 
    <num>03</num> 
    <num>04</num> 
    <num>05</num> 
    <num>06</num> 
    <num>07</num> 
    <num>08</num> 
    <num>09</num> 
    <num>010</num> 
</nums> 

производит требуемые два файла: file1.xml и file2.xml, которые содержат соответственно элементы num с нечетными и с четными значениями.

Обратите внимание:, что нет «множительных проходов», и код «встроенный», если требуется.

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

  • Нет связанных вопросов^_^