0

タグをソートおよびグループ化する際に、タグから属性を削除するにはどうすればよいですか?

並べ替え中に条件付きロジックを適用する方法を見つけましたが、それをグループ化と組み合わせる方法は見つかりませんでした。

私のコードは実際には次のようになります。

<?xml version="1.0" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:variable name="sortOrder" select="'|IL|CL|BL|INST|CDOL|TL|SL|GL|DL|'" />
<xsl:template match="taskDesc">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
    <xsl:for-each-group select="sectionDesc" group-adjacent="replace(@name, '^(.*)?_[^_]*$', '$1')">
    <xsl:perform-sort select="current-group()">
        <xsl:sort select="string-length(substring-before($sortOrder,
                                concat('|', replace(@name, '^.*?_([^_]*$)', '$1'), '|')))"
        data-type="number" />
    </xsl:perform-sort>
    </xsl:for-each-group>
        </xsl:copy>
</xsl:template>
<xsl:template match="@*|node()"> <-- Copy
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

sectionDesc一部のタグFMOrderには、削除する必要があるという属性があります。この属性は 以外の他のタグで使用されているtaskDescため、グローバルに削除することはできません。

入力ファイルの例:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<FEFExchangeFile>
    <!-- Tons of tags -->
    <logicConf>
        <resource> <!-- Tons of attrs -->
            <taskDesc> <!-- Tons of attrs -->
                <sectionDesc name="a_b_c_GL" otherstuff="dummy" FMOrder="someothervalue"></sectionDesc>
                <sectionDesc name="a_b_c_IL" otherstuff="dummy" FMOrder="somevalue"></sectionDesc>
                <!-- Many other tags like this with or without FMOrder attr -->
            </taskDesc>
        </resource>
    </logicConf>
</FEFExchangeFile>
4

1 に答える 1

1

あなたのXMLを見る必要がありますが、おそらく変更されています

<xsl:for-each-group select="sectionDesc" group-adjacent="replace(@name, '^(.*)?_[^_]*$', '$1')">
<xsl:perform-sort select="current-group()">
    <xsl:sort select="string-length(substring-before($sortOrder,
                            concat('|', replace(@name, '^.*?_([^_]*$)', '$1'), '|')))"
    data-type="number" />
</xsl:perform-sort>
</xsl:for-each-group>

<xsl:for-each-group select="sectionDesc" group-adjacent="replace(@name, '^(.*)?_[^_]*$', '$1')">
<xsl:apply-templates select="current-group()">
    <xsl:sort select="string-length(substring-before($sortOrder,
                            concat('|', replace(@name, '^.*?_([^_]*$)', '$1'), '|')))"
    data-type="number" />
</xsl:apply-templates>
</xsl:for-each-group>

テンプレートの追加

<xsl:template match="sectionDesc/@FMOrder"/>

役立ちます。

于 2013-05-28T16:45:16.180 に答える