创建作为XML副本的XSLT变量、附加节点、循环变量和输出值
我有以下XML:创建作为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 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>