需要存储在中为每个非';它不是XML文件的一部分
我正在使用XSLT将2个XML文件转换为C代码(XSLT2.0) 目标是生成.c文件所需的需要存储在中为每个非';它不是XML文件的一部分,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,我正在使用XSLT将2个XML文件转换为C代码(XSLT2.0) 目标是生成.c文件所需的#include(可能很多) 我需要在两个不同的地方查找#include名称的可变部分:一个可以直接从一个XML文件中读取,但第二个需要在找到第一个文件后搜索另一个文件(这两个文件都是生成的XML文件,很适合继承的代码!) 这很好,但我想消除不可避免的重复。 如果我只是编写C代码,我会创建一个数组,添加每个唯一的$module和$refModule,然后遍历它并打印出来 我的第一种方法是使用previous
#include
(可能很多)
我需要在两个不同的地方查找#include
名称的可变部分:一个可以直接从一个XML文件中读取,但第二个需要在找到第一个文件后搜索另一个文件(这两个文件都是生成的XML文件,很适合继承的代码!)
这很好,但我想消除不可避免的重复。
如果我只是编写C代码,我会创建一个数组,添加每个唯一的$module
和$refModule
,然后遍历它并打印出来
我的第一种方法是使用previous::parameter/@module
避免重复,问题是previous::parameter/@refModule
不存在,因为它不属于此XML文件previous::parameter/$refModule
也不起作用(在XSLT中变量作用域上没有100%清除)
我想我可以处理这个独特的部分,但是我的问题是如何存储这些非XML值,以便在对每个执行之后遍历它们并将它们打印出来?模板?也许我根本不需要存储?
注意:我可以提供XML输入,但我认为这对我的问题没有帮助(让我知道)
谢谢
编辑:在已经解决的情况下,为任何有类似问题的不幸者添加一些附加信息
输入XML 1:
<event name="PolicyError">
<!-- list of parameters -->
<parameterList>
<parameter
name="Index" module="COMPANY-TEAM-NG-MIB"
/>
<parameter
name="PolicyId" module="COMPANY-TEAM-NG-MIB"
/>
</parameterList>
</event>
为了简单起见,我省略了eventgen:ref module lookup
函数和第二个XML文件,但它基本上使用给定的名称
和模块
来查找根模块
(refModule
)其中定义了name
,您没有给出我可以测试的示例,但是如果您可以将所有可能的值放入一个序列中,那么您可以使用不同的值来删除重复项,例如:
<xsl:variable name="moduleNames" select="distinct-values(/root/eventDoc/event
/parameterList/parameter/(@module, eventgen:ref-module-lookup(@name, @module)))"/>
<xsl:for-each select="$moduleNames">
<xsl:value-of select="concat(' #include "agent/gen/',
lower-case(translate(., '-', '_')),
'.h"')"/>
</xsl:for-each>
处理不同组的结果保证按组在输入序列中第一次提到的顺序输出。为了完整起见,下面是我最后使用的解决方案。伊恩99%都得到了解决方案,我只需要按字母顺序对我的#includes
进行排序
<xsl:variable name="moduleNames" select="distinct-values(/root/eventDoc/event/parameterList/parameter/(@module, eventgen:ref-module-lookup(@name, @module)))"/>
<xsl:for-each select="$moduleNames">
<xsl:sort select="." />
<xsl:value-of select="concat(' #include "agent/gen/',
lower-case(translate(., '-', '_')),
'.h"')"/>
</xsl:for-each>
我认为如果你能给出一个更好的答案;完整的最小输入文件、完整的最小样式表以及那些特定输入的完整输出。
#include "agent/gen/company_team_ng_mib.h"
<xsl:variable name="moduleNames" select="distinct-values(/root/eventDoc/event
/parameterList/parameter/(@module, eventgen:ref-module-lookup(@name, @module)))"/>
<xsl:for-each select="$moduleNames">
<xsl:value-of select="concat(' #include "agent/gen/',
lower-case(translate(., '-', '_')),
'.h"')"/>
</xsl:for-each>
<xsl:variable name="moduleNames" select="/root/eventDoc/event
/parameterList/parameter/(@module, eventgen:ref-module-lookup(@name, @module))"/>
<xsl:for-each-group select="$moduleNames" group-by=".">
<xsl:value-of select="concat(' #include "agent/gen/',
lower-case(translate(., '-', '_')),
'.h"')"/>
</xsl:for-each-group>
<xsl:variable name="moduleNames" select="distinct-values(/root/eventDoc/event/parameterList/parameter/(@module, eventgen:ref-module-lookup(@name, @module)))"/>
<xsl:for-each select="$moduleNames">
<xsl:sort select="." />
<xsl:value-of select="concat(' #include "agent/gen/',
lower-case(translate(., '-', '_')),
'.h"')"/>
</xsl:for-each>