Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要存储在中为每个非';它不是XML文件的一部分_Xml_Xslt_Xslt 2.0 - Fatal编程技术网

需要存储在中为每个非';它不是XML文件的一部分

需要存储在中为每个非';它不是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

我正在使用XSLT将2个XML文件转换为C代码(XSLT2.0)

目标是生成.c文件所需的
#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('&#10;#include &quot;agent/gen/',
                               lower-case(translate(., '-', '_')),
                               '.h&quot;')"/>
</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('&#10;#include &quot;agent/gen/',
                           lower-case(translate(., '-', '_')),
                           '.h&quot;')"/>
  </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('&#10;#include &quot;agent/gen/',
                               lower-case(translate(., '-', '_')),
                               '.h&quot;')"/>
</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('&#10;#include &quot;agent/gen/',
                               lower-case(translate(., '-', '_')),
                               '.h&quot;')"/>
</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('&#10;#include &quot;agent/gen/',
                           lower-case(translate(., '-', '_')),
                           '.h&quot;')"/>
  </xsl:for-each>