1

我有以下 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 文件;它基本上是一个花哨的邮件合并。但是,查询没有返回一些行,我需要在循环数据之前将它们添加到 XML 文档中。

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

4

1 回答 1

0

这应该这样做:

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

The variable contains an XML fragment, that needs to be converted to a node-set to be used in the for-each - this is done with the Microsoft-specific extension function msxsl:node-set(), other XSLT processor have equivalent functions.

(I am not totally sure why you need the variable - I think that the job could be done directly, but in any case the code above creates the variable first and then enumerates on it)

于 2013-08-02T13:46:47.663 回答