XSLT:对对象进行排序并保留注释

问题描述 投票:0回答:1

我正在使用一个工具将游戏数据转换为 XML,但该工具的怪癖之一是它以字母数字方式而不是数字方式输出父代码对象,示例输出带有以下注释:

<container format="RTPC" endian="Little">
    <object>
        <object name="root">
            <object name="0"><!-- disables input -->
                <value name="_class" type="string">CInputActionOverride</value>
                <value name="_class_hash" type="int">-1833934533</value>
                <value name="_object_id" type="objectid">26D7913A,0</value>
                <value name="action_list" type="string">Accelerate</value><!-- action name -->
                <value name="activate_event" type="vec_events">death_run_play_cutscene,0x0</value>
            </object>
            <object name="1">
                <value name="_class" type="string">CGameObjectList</value>
                <value name="_class_hash" type="int">-1531974803</value>
                <value name="_object_id" type="objectid">C51129BC,0</value><!-- spawn list ref -->
                <value name="name" type="string">SpawnedVehicleList</value>
                <value name="tags" type="vec_int"/>
            </object>
            <object name="10">
                <value name="_class" type="string">CNavMeshDynamicObstacle</value>
                <value name="_class_hash" type="int">838607288</value>
                <value name="_object_id" type="objectid">F96135EC,0</value>
                <value name="disable_event" type="vec_events"/>
                <value name="enable_event" type="vec_events"/>
                <value name="enabled_from_start" type="int">1</value>
            </object>
            <object name="100">
                <value name="_class" type="string">SAnimationLayerInfo</value>
                <value name="_class_hash" type="int">-786417417</value>
                <value name="_object_id" type="objectid">B2B5BF10,0</value>
                <value name="file" type="string">animations/characters/light_facelayer.al</value><!-- anim path -->
                <value name="layer_index" type="int">1</value>
                <value name="layer_name" type="string">Face</value>
                <value name="name" type="string">AnimationLayerInfoFace</value>
            </object>
            <object name="102">
                <value name="_class" type="string">CSpawnReferencePosition</value>
                <value name="_class_hash" type="int">-1429677905</value>
                <value name="_object_id" type="objectid">1958DDF6,0</value>
                <value name="keep_orientation" type="int">1</value>
                <value name="name" type="string">CSpawnReferencePosition</value>
                <value name="no_create_on_load" type="int">1</value>
                <value name="tags" type="vec_int"/>
            </object>
        </object>
    </object>
</container>

为了解决这个排序问题,我使用了我发现的这个稍微修改过的 XSL 模板:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" encoding="UTF-8" indent="yes"/>

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

    <xsl:template match="object">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:apply-templates select="*">
                <xsl:sort select="@name" data-type="number" order="ascending"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

这个模板可以完成工作,但我面临的另一个问题是转换会吃掉所有评论 [我相信这是默认行为] 并且我的 XSL 知识几乎不存在,这意味着我很难弄清楚列出对代码对象进行排序并保留所有注释所需的代码。

xml xslt
1个回答
0
投票

我在示例输入中看到的所有注释都是需要排序的“编号”

object
元素的子元素。

假设没有任何注释是

object
的子级,其
name
root
,您可以通过稍微修改模板来解决您的问题,而不是:

<xsl:template match="object">

上面写着:

<xsl:template match="object[@name='root']">
© www.soinside.com 2019 - 2024. All rights reserved.