Xml 使用集合的XSLT转换缺少上下文项

Xml 使用集合的XSLT转换缺少上下文项,xml,xslt,xslt-2.0,saxon,Xml,Xslt,Xslt 2.0,Saxon,我想使用XSLT读取子目录中的所有XML文件,并将结果输出到单个XML文件,但收到一条错误消息,即缺少上下文项。如果XSL一次应用于一个文件,它就可以工作,但是我在使用Collection函数时无法让它工作 以下是XSL: <xsl:template match="node()|@*" mode="inFile"> <xsl:copy> <xsl:apply-templates mode="inFile"

我想使用XSLT读取子目录中的所有XML文件,并将结果输出到单个XML文件,但收到一条错误消息,即缺少上下文项。如果XSL一次应用于一个文件,它就可以工作,但是我在使用Collection函数时无法让它工作

以下是XSL:

<xsl:template match="node()|@*" mode="inFile">
             <xsl:copy>
                  <xsl:apply-templates mode="inFile" select="node()|@*"/>
             </xsl:copy>
        </xsl:template>

<xsl:template name="main" match="/">
    <xsl:apply-templates mode="inFile" select="collection('file:///C:/2011 Valid XML/XML?select=*.xml;recurse=yes')"/>
    <LookupTables>
        <Facility_Identifiers>
            <xsl:for-each select="/Report/RegistrationData/Facility/Identifiers/IdentifierList">
                <Facility_Identifier Org="{/Report/RegistrationData/Organisation/Details/BusinessLegalName}" Facility="{/Report/RegistrationData/Facility/Details/FacilityName}" NPRI_ID="{Identifier[IdentifierType = 'NationalPollutantReleaseInventoryId']/IdentifierValue}" GHGIS_ID="{Identifier[IdentifierType = 'GHGRPId']/IdentifierValue}"/>
            </xsl:for-each>
        </Facility_Identifiers>
        <NAICS_Details>
            <xsl:for-each select="/Report/RegistrationData/Facility/Identifiers/NAICSCodeList/NAICSCode">
                <NAICS_Detail Org="{/Report/RegistrationData/Organisation/Details/BusinessLegalName}" Facility="{/Report/RegistrationData/Facility/Details/FacilityName}" NAICS="{Code}" Classification="{NAICSClassification}" Percentage="{ActivityPercentage}"/>
            </xsl:for-each>
        </NAICS_Details>
    </LookupTables>
</xsl:template>
我希望目标XML文件如下所示:

<Report xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
    <RegistrationData>  
        <Facility>  
            <Details>  
                <FacilityName>Random Location</FacilityName>  
            </Details>  
            <Identifiers>  
                <IdentifierList>  
                    <Identifier>  
                        <IdentifierType>NationalPollutantReleaseInventoryId</IdentifierType>  
                        <IdentifierValue>N999</IdentifierValue>  
                    </Identifier>  
                    <Identifier>  
                        <IdentifierType>GHGRPId</IdentifierType>  
                        <IdentifierValue>G77777</IdentifierValue>  
                    </Identifier>  
                </IdentifierList>  
                <NAICSCodeList>  
                    <NAICSCode>  
                        <NAICSClassification>205</NAICSClassification>  
                        <Code>322121</Code>  
                        <ActivityPercentage>100.00</ActivityPercentage>  
                    </NAICSCode>  
                    <NAICSCode>  
                        <NAICSClassification>81</NAICSClassification>  
                        <Code>221112</Code>  
                        <ActivityPercentage>90.00</ActivityPercentage>  
                    </NAICSCode>  
                </NAICSCodeList>  
            </Identifiers>  
        </Facility>  
        <Organisation>  
            <Details>  
                <BusinessLegalName>The Corporation</BusinessLegalName>  
            </Details>  
        </Organisation>  
    </RegistrationData>  
</Report>  
<LookupTables>  
    <Facility_Identifiers>  
        <Facility_Identifier Org="The Corporation" Facility="Random Location" NPRI_ID="N999" GHGIS_ID="G77777"/>  
    </Facility_Identifiers>  
    <NAICS_Details>  
        <NAICS_Detail Org="The Corporation" Facility="Random Location" NAICS="322121" Classification="205" Percentage="100.00"/>  
        <NAICS_Detail Org="The Corporation" Facility="Random Location" NAICS="221112" Classification="81" Percentage="90.00"/>  
    </NAICS_Details>  
</LookupTables>

如果要从所有文件中编译数据,请使用以下方法

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output indent="yes"/>

<xsl:param name="input-dir" select="'file:///C:/2011 Valid XML/XML'"/>

<xsl:template name="main">
  <LookupTables>
        <xsl:variable name="input-docs"
          select="collection(iri-to-uri(concat($input-dir, '?select=*.xml')))"/>
        <Facility_Identifiers>
            <xsl:for-each select="$input-docs/Report/RegistrationData/Facility/Identifiers/IdentifierList">
                <Facility_Identifier Org="{ancestor::RegistrationData/Organisation/Details/BusinessLegalName}" 
                Facility="{ancestor::RegistrationData/Facility/Details/FacilityName}" 
                NPRI_ID="{Identifier[IdentifierType = 'NationalPollutantReleaseInventoryId']/IdentifierValue}" GHGIS_ID="{Identifier[IdentifierType = 'GHGRPId']/IdentifierValue}"/>
            </xsl:for-each>
        </Facility_Identifiers>
        <NAICS_Details>
            <xsl:for-each select="$input-docs/Report/RegistrationData/Facility/Identifiers/NAICSCodeList/NAICSCode">
                <NAICS_Detail Org="{ancestor::RegistrationData/Organisation/Details/BusinessLegalName}" 
                Facility="{ancestor::RegistrationData/Facility/Details/FacilityName}" NAICS="{Code}" 
                Classification="{NAICSClassification}" Percentage="{ActivityPercentage}"/>
            </xsl:for-each>
        </NAICS_Details>  </LookupTables>
</xsl:template>

</xsl:stylesheet>


请发布输入文档的结构和所需结果的结构,目前我们所知道的是,您希望将目录中的所有文件拉入以创建单个结果文件。但我们不知道您希望如何组合这些文件,以及应该在
LookupTables
元素中填充哪些文件,在该元素中,您使用的路径类似于
/Report/RegistrationData/Facility/Identifiers/IdentifierList
。也许你想要
collection('file:///C:/2011 有效的XML/XML?选择=*.XML;recurse=yes')/Report/RegistrationData/Facility/Identifiers/IdentifierList
。我已经编辑了原始问题,包括XSL、源XML和目标XML。