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 使用参数和输出值调用模板-XSLT_Xml_Xslt_Csv - Fatal编程技术网

Xml 使用参数和输出值调用模板-XSLT

Xml 使用参数和输出值调用模板-XSLT,xml,xslt,csv,Xml,Xslt,Csv,我有一个由2个不同的xml文件组成的1个大xml文件。 我想做的是,当我创建一个CSV文件时,我希望能够从与第一部分匹配的文件的第二部分获取数据。 我使用for-each循环遍历文件第一部分中的所有数据,然后使用嵌套循环获取匹配数据。 以下是XML布局: <?xml version="1.0" encoding="UTF-8"?> <Report_Data> <Report_Entry> <company_id>001<

我有一个由2个不同的xml文件组成的1个大xml文件。 我想做的是,当我创建一个CSV文件时,我希望能够从与第一部分匹配的文件的第二部分获取数据。 我使用for-each循环遍历文件第一部分中的所有数据,然后使用嵌套循环获取匹配数据。 以下是XML布局:

<?xml version="1.0" encoding="UTF-8"?>
<Report_Data>
    <Report_Entry>
        <company_id>001</company_id>
        <dept>TestDept</dept>
    </Report_Entry>
    <Report_Entry>
    </Report_Entry>
    <Company_Data>
        <Report_Entry>
            <code>1</code>
            <name>Test1</name>
        </Report_Entry>
        <Report_Entry>
            <code>2</code>
            <name>Test2</name>
        </Report_Entry>
    </Company_Data>
</Report_Data>
在我的CSV中,我希望将公司数据节点中的名称插入到公司id之后的输出中

这是我的XSL文件(它当前不起作用,它循环并输出输出文件中每个公司数据节点的N/A):

而不是:

1, Test1, TestDept
它不输出
名称
节点的值。 如何使其显示值


如果需要更多信息,我可以添加内容。

我不能添加评论来要求澄清您希望准确输出的内容,但有一些观察结果:

当前,样式表将遍历每个company\u id元素,对于找到的每个元素,样式表将遍历每个company\u Data/Report\u Entry元素。 您看到N/A是因为对于每个公司id,它会检查每个公司数据/报告条目,并输出与当前公司id不匹配的N/A。 在我看来,您只需要删除否则(在这种情况下,您不需要选择,只需要if)。 请注意,当我尝试运行您的样式表时,我得到001,Test1,N/A,,Test1,N/A,与您的样式表略有不同(但我必须为每个结束标记添加一个缺失的标记)

就代码和名称元素而言,由于您处于for循环中,因此焦点已转移到正在循环的元素(Report\u Data/Company\u Data/Report\u Entry),因此您可以使用将从该循环元素导航的相对路径。
所以你可以只使用“代码”或“名称”。您甚至不需要“/”,因为这会产生相同的结果

您不需要在这里为每个循环使用内部的xsl:for来查找公司名称。您可以在这里使用一个xsl:variable和一个select参数,您可以在其中放置“contains”表达式

<xsl:for-each select="Report_Data/Report_Entry">
    <xsl:variable 
         name="company_name" 
         select="/Report_Data/Company_Data/Report_Entry[contains(current()/company_id, code)]/name" />
然后你可以这样做来查找它

<xsl:for-each select="Report_Data/Report_Entry">
    <xsl:variable name="company_name" select="key('company', company_id)" />

当然,在您的情况下,这可能会失败,因为ID不完全相同,但也许您可以删除前导零。也许试试这个

<xsl:for-each select="Report_Data/Report_Entry">
    <xsl:variable name="company_name" select="key('company', number(company_id))" />

<xsl:key name="company" match="Company_Data/Report_Entry" use="code" />
<xsl:for-each select="Report_Data/Report_Entry">
    <xsl:variable name="company_name" select="key('company', company_id)" />
<xsl:for-each select="Report_Data/Report_Entry">
    <xsl:variable name="company_name" select="key('company', number(company_id))" />