创建作为XML副本的XSLT变量、附加节点、循环变量和输出值

创建作为XML副本的XSLT变量、附加节点、循环变量和输出值,xslt,Xslt,我有以下XML: <xml version="1.0" encoding="UTF-8"> <query> <row> <Name>Ed</Name> <ID>11</ID> </row> <row> <Name>Chad</Name&

我有以下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>
之所以要使用变量,是因为我正在使用针对Oracle BI Publisher的Microsoft Word插件。该插件允许您使用XSLT创建模板,该模板从查询中获取XML结果以生成PDF文件;这基本上是一个奇特的邮件合并。但是,在循环遍历数据之前,需要将一些查询未返回的行添加到XML文档中

由于模板的性质,我认为在处理XML之前不能使用外部XSL文件来修改它。因此,我唯一能想到的就是创建一个包含所有XML的变量,将查询不会返回的附加节点附加到变量中的XML,然后循环该变量以输出值。我一直在搜索SO,并找到了类似的帖子,但我不希望结果是一个修改过的XML文件,我希望它能像变量一样立即在模板中使用

这应该可以做到:

<?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处理器具有等效的函数

我不完全确定您为什么需要这个变量——我认为可以直接完成这项工作,但无论如何,上面的代码首先创建变量,然后对其进行枚举

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