创建XSLT变量,它是XML的副本,附加节点,循环变量和输出值

时间:2013-08-02 13:17:01

标签: 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

我想使用变量的原因是因为我正在使用Oracle BI Publisher的Microsoft Word插件。此插件允许您使用XSLT创建模板,该模板从查询中获取XML结果以生成PDF文件;它基本上是一个花哨的邮件合并。但是,在我循环访问数据之前,我需要在查询中返回一些行。

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

1 个答案:

答案 0 :(得分: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处理器具有相同的功能。

(我不完全确定你为什么需要这个变量 - 我认为这个工作可以直接完成,但无论如何上面的代码首先创建变量然后枚举它)