如何使用XSLT拆分XML文件?

时间:2011-12-20 04:08:32

标签: xml xslt xpath xml-parsing

请参阅我在项目中使用的sample XML file。我需要根据XML文件中的“对象”拆分(拆分)此文件。幸运的是,有一个tool可用,它使用XSLT拆分文件。请参阅XSL here

当对象的形式如下 -

<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>

工具拆分未正确归档 - 缺少hive / key等信息。 Sample output请参阅this

当对象的形式如下 -

<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>

它运作得很好。请参阅this。用于根据对象分割文件的代码是 -

<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代码,这样它就可以在没有“object_reference”时提取“对象”

1 个答案:

答案 0 :(得分:0)

我通过更新xsl查询as-

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