按属性值中的第一个单词对XML进行排序

时间:2018-04-11 13:56:43

标签: xml xslt

我有一个XML文件(下面是其中的一部分),包含超过1000行代码,如下所示

<?xml version="1.0" encoding="UTF-8" ?>

<exchange xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<viewpoints>    
    <view name="002. PG vs MD - Overview">
            <viewpoint tool="none" render="shaded" lighting="headlight" focal="30.3740807783">
                <camera projection="persp" near="1.0000000000" far="10.0000000000" aspect="1.4551804424" height="0.7853981634">
                    <position>
                        <pos3f x="14.2834498406" y="-183.6741132934" z="35.6151508952"/>
                    </position>
                    <rotation>
                        <quaternion a="0.3979643079" b="0.0563656552" c="0.1284089725" d="0.9066192466"/>
                    </rotation>
                </camera>
            </viewpoint>
        </view>

        <view name="004. EL vs MD - Overview">
            <viewpoint tool="none" render="shaded" lighting="headlight" focal="30.3740807783">
                <camera projection="persp" near="1.0000000000" far="10.0000000000" aspect="1.4551804424" height="0.7853981634">
                    <position>
                        <pos3f x="14.2834498406" y="-183.6741132934" z="35.6151508952"/>
                    </position>
                    <rotation>
                        <quaternion a="0.3979643079" b="0.0563656552" c="0.1284089725" d="0.9066192466"/>
                    </rotation>
                </camera>
            </viewpoint>
        </view>
    </viewpoints>
</exchange>

我想使用属性“name”对上面的代码进行排序,但我希望使用属性值中的第一个单词进行排序。在上面的例子中,我想使用 PG / EL 感到疼痛。

P.S:请注意我对XSLT或其他任何工具都不是很熟悉,但我可能很难理解它。

2 个答案:

答案 0 :(得分:2)

您已经举例说明了要排序的两个元素,对于这两个元素,“第一个单词”可以获得为substring(@name, 6, 2)substring-after(substring-before(@name, ' '), ' ')。如果这些表达式中的任何一个适用于您的所有数据,请将它们用作xsl:sort中的排序键。否则,你需要告诉我们

(a)你究竟是什么意思“单词”

(b)您正在使用的XSLT版本(如果您可以使用XSLT 2.0,任何更复杂的字符串操作将变得非常容易)

答案 1 :(得分:-1)

没关系,我明白了。以下XLST对XML进行排序

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="/">
    <root>
       <xsl:apply-templates select="viewpoints/view">
          <xsl:sort select="substring-after(substring-before(@name, 'vs'), '.')" order="ascending"/>
       </xsl:apply-templates>
     </root>
 </xsl:template>
 <xsl:template match="view">
     <xsl:copy-of select="."/>
 </xsl:template>
</xsl:stylesheet>

但是此代码会删除&#34; <view>&#34;之前的所有标记。标记并替换为&#34; <root>&#34;。它编辑了视图标记,如下所示&#34; <view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name=" #viewname# ">&#34;。以下是输出

<?xml version="1.0"?>
<root>

    <view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="004. EL vs MD - Overview">
        <viewpoint tool="none" render="shaded" lighting="headlight" focal="30.3740807783">
            <camera projection="persp" near="1.0000000000" far="10.0000000000" aspect="1.4551804424" height="0.7853981634">
                <position>
                    <pos3f x="14.2834498406" y="-183.6741132934" z="35.6151508952"/>
                </position>
                <rotation>
                    <quaternion a="0.3979643079" b="0.0563656552" c="0.1284089725" d="0.9066192466"/>
                </rotation>
            </camera>
        </viewpoint>
    </view>

<view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="002. PG vs MD - Overview">
        <viewpoint tool="none" render="shaded" lighting="headlight" focal="30.3740807783">
            <camera projection="persp" near="1.0000000000" far="10.0000000000" aspect="1.4551804424" height="0.7853981634">
                <position>
                    <pos3f x="14.2834498406" y="-183.6741132934" z="35.6151508952"/>
                </position>
                <rotation>
                    <quaternion a="0.3979643079" b="0.0563656552" c="0.1284089725" d="0.9066192466"/>
                </rotation>
            </camera>
        </viewpoint>
    </view>

</root>

如何解决这个问题?

PS:请查看上面的XML代码