我有以下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文件,我希望它能够像模板一样立即在模板中使用。
答案 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处理器具有相同的功能。
(我不完全确定你为什么需要这个变量 - 我认为这个工作可以直接完成,但无论如何上面的代码首先创建变量然后枚举它)