2013-08-02 1 views
1

У меня есть следующий XML:Создать переменную XSLT, которая является копией XML, добавление узлов, проходных значений переменных и выходных

<xml version="1.0" encoding="UTF-8"> 
    <query> 
     <row> 
      <Name>Ed</Name> 
      <ID>11</ID> 
     </row> 
     <row> 
      <Name>Chad</Name> 
      <ID>12</ID> 
     </row> 
     <row> 
      <Name>Jason</Name> 
      <ID>13</ID> 
     </row> 
    </query> 
</xml> 

Я хочу использовать XSLT, чтобы сделать следующее:

<create a variable that is a copy of the entire XML document> 
<append an additional node to the XML in the variable> 
<loop through each <row> inside the new variable and output the name and ID> 

Так в переменном, я хочу закончить с этим XML

<xml version="1.0" encoding="UTF-8"> 
    <query> 
     <row> 
      <Name>Ed</Name> 
      <ID>11</ID> 
     </row> 
     <row> 
      <Name>Chad</Name> 
      <ID>12</ID> 
     </row> 
     <row> 
      <Name>Jason</Name> 
      <ID>13</ID> 
     </row> 
     <row> 
      <Name>Mark</Name> 
      <ID>14</ID> 
     </row> 
    </query> 
</xml> 

и в конечном итоге с этим выходом:

Ed 
11 

Chad 
12 

Jason 
13 

Mark 
14 

Причина, по которой я хочу использовать переменную, заключается в том, что я использую подключаемый модуль Microsoft Word для Oracle BI Publisher. Этот плагин позволяет создать шаблон с использованием XSLT, который принимает результаты XML из запроса для создания PDF-файла; в основном это причудливое слияние писем. Есть несколько строк, которые не возвращаются запросом, однако, что мне нужно добавить в документ XML, прежде чем я прокручу данные.

Из-за природы шаблона, я не думаю, что могу использовать внешний XSL-файл для изменения XML, прежде чем обрабатывать его. Итак, единственное, что я могу придумать, - создать переменную со всем XML, добавить дополнительные узлы, которые не будут возвращены запросом в XML в переменной, а затем пропустить эту переменную для вывода значений. Я искал SO и нашел сообщения, такие как this, но я не хочу, чтобы результат был измененным XML-файлом, я хочу, чтобы это было чем-то, что я могу использовать в шаблоне сразу как переменная.

ответ

1

Это следует сделать это:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
> 
    <xsl:output method="text" /> 

    <xsl:template match="/query"> 
    <xsl:variable name="xmlFragment"> 
     <query> 
     <xsl:copy-of select="*"/> 
     <row> 
      <Name>Mark</Name> 
      <ID>14</ID> 
     </row> 
     </query> 
    </xsl:variable> 
    <xsl:for-each select="msxsl:node-set($xmlFragment)/query/*"> 
     <xsl:value-of select="Name"/> 
     <xsl:text xml:space="preserve"> 
</xsl:text> 
     <xsl:value-of select="ID"/> 
     <xsl:text xml:space="preserve"> 
</xsl:text> 
     <xsl:text xml:space="preserve"> 
</xsl:text> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

переменная содержит фрагмент XML, который должен быть преобразован в набор узлов, которые будут использоваться в for-each - это делается с помощью Microsoft-специфической функции расширения msxsl:node-set(), другие XSLT-процессоры имеют эквивалентные функции.

(Я не совсем уверен, зачем нужна переменная - я думаю, что это задание можно выполнить напрямую, но в любом случае приведенный выше код сначала создает переменную, а затем перечисляет ее)

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