如何使用XSLT拆分XML文件?

如何使用XSLT拆分XML文件?,xml,xslt,xpath,xml-parsing,Xml,Xslt,Xpath,Xml Parsing,请参考我在我的项目中使用的。我需要根据XML文件中的对象拆分此文件。幸运的是,有一种可用的方法可以使用XSLT拆分文件。请参考XSL 当对象的形式如下所示时- <registry_object id="oval:org.mitre.oval:obj:16243" version="1" xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5#windows"> <hive>HKEY_LOCAL_MACHINE

请参考我在我的项目中使用的。我需要根据XML文件中的对象拆分此文件。幸运的是,有一种可用的方法可以使用XSLT拆分文件。请参考XSL

当对象的形式如下所示时-

<registry_object id="oval:org.mitre.oval:obj:16243" version="1" xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5#windows">
  <hive>HKEY_LOCAL_MACHINE</hive>
  <key>SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\IPFS</key>
  <name>DisplayName</name>
</registry_object>
<registry_object id="oval:org.mitre.oval:obj:16179" version="2" comment="Uninstall\IPFS\DisplayName" xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5#windows">
  <set xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5">
    <object_reference>oval:org.mitre.oval:obj:16050</object_reference>
    <object_reference>oval:org.mitre.oval:obj:16243</object_reference>
  </set>
</registry_object>
工具拆分文件不正确-缺少配置单元/密钥等信息。指

当对象的形式如下所示时—

<registry_object id="oval:org.mitre.oval:obj:16243" version="1" xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5#windows">
  <hive>HKEY_LOCAL_MACHINE</hive>
  <key>SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\IPFS</key>
  <name>DisplayName</name>
</registry_object>
<registry_object id="oval:org.mitre.oval:obj:16179" version="2" comment="Uninstall\IPFS\DisplayName" xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5#windows">
  <set xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5">
    <object_reference>oval:org.mitre.oval:obj:16050</object_reference>
    <object_reference>oval:org.mitre.oval:obj:16243</object_reference>
  </set>
</registry_object>
它很好用。提到用于根据对象分割文件的代码为-

<xsl:when test="contains($inputId, ':obj:')">
<xsl:for-each select="$definitionDoc//oval-def:objects/child::*[@id = $inputId]/descendant::*/*:object_reference/text() | $definitionDoc//oval-def:objects/child::*[@id = $inputId]/descendant::*/*:filter/text() | 
                $definitionDoc//oval-def:objects/child::*[@id = $inputId]/descendant::*/*:var_ref/text() | 
                $definitionDoc//oval-def:objects/child::*[@id = $inputId]/descendant::*/@var_ref">              

                <xsl:variable name="returnedIds" select="ovalfn:getAllIds(($processedIds | $inputId), .)"/>
                xsl:sequence select="$returnedIds | $processedIds | $inputId | ."/>
            </xsl:for-each>

因为我不知道XSLT,所以我不知道如何解决这个问题。有人能提供一些如何解决这一问题的指导吗?我想我需要更新上面的XSL代码,这样它就可以在没有对象引用的情况下提取对象

我通过将XSL查询更新为-

$definitionDoc//oval-def:objects/child::*[@id = $inputId]/descendant::*/.

那么,在这两种情况下,每种情况下都会产生什么样的产出,而必须产生什么样的产出呢?此外,您还没有尽可能少地提供完整的XML文档和完整的XML转换,因此无法再现这样的说法,即未提供其中一个XML文档时,未提供的转换会产生未提供的不需要的输出,这是由于未指定/解释的某些原因而不需要的,但是对于第二个XML文档,由于没有指定/解释某些原因,没有提供的结果是好的。请提供所有缺少的数据我提供了示例文档和通过链接使用的XSL。您可以单击示例XML文件,并在我问题的第一段中查看参考XML文档和XSL。我现在用好的和坏的输出更新了这个问题