1

私は多くの同様の質問と XSLT チュートリアルを経験してきましたが、それでも XSLT の仕組みを理解できません。

以下は、並べ替えたい XML です:-

<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.1" version="1.1">
<file product="mxn" source-language="en">
<body>

<!-- Menu -->

    <msg-unit id="Menu.PerformTask">
        <msg>Perform Task</msg>
        <note>When selected performs a task.</note>
    </msg-unit>
    <msg-unit id="Menu.Add">
        <msg>Add New</msg>
        <note>When selected Adds a new row.</note>
    </msg-unit>

</body>
</file>
</xliff>

期待される出力は次のとおりです:-

<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.1" version="1.1">
<file product="mxn" source-language="en">
<body>

<!-- Menu -->

    <msg-unit id="Menu.Add">
        <msg>Add New</msg>
        <note>When selected Adds a new row.</note>
    </msg-unit>
    <msg-unit id="Menu.PerformTask">
        <msg>Perform Task</msg>
        <note>When selected performs a task.</note>
    </msg-unit>

</body>
</file>
</xliff>

タグは、属性<msg-unit>の値に基づいてソートする必要があります。id他のタグ (コメントなど) は、元の場所にある必要があります。

非常に多くの組み合わせを試しましたが、XSLT についての手がかりがありません。以下は私の最後の試みでした。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" indent="yes" />
    <xsl:template match="/">
        <xsl:copy-of select="*">
            <xsl:apply-templates>
                <xsl:sort select="attribute(id)" />
            </xsl:apply-templates>
        </xsl:copy-of>
    </xsl:template>
</xsl:stylesheet>

これは、取得した XML をソートせずに吐き出すだけです。

4

1 に答える 1

1

編集更新 - このテンプレートは、残りの xml に干渉することなく、msg-unit要素のみを並べ替えます。@id

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                >
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:choose>
                <xsl:when test="*[local-name()='msg-unit']">
                    <xsl:apply-templates select="@* | node()">
                        <xsl:sort select="@id" />
                    </xsl:apply-templates>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:apply-templates select="@* | node()" />
                </xsl:otherwise>
            </xsl:choose>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
于 2012-09-06T15:35:10.093 に答える