XSLT 2.0 - 使用分组排序时删除属性

时间:2013-05-28 16:21:04

标签: xslt

在我对它们进行排序和分组时,如何从标签中删除属性?

我找到了how to apply conditional logic while sorting,但没有找到如何将其与分组相结合。

我的代码实际上是这样的:

<?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的{​​{1}}标记的属性。 此属性用于FMOrder之外的其他标记,因此我无法将其全局删除。

输入文件示例:

taskDesc

1 个答案:

答案 0 :(得分: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"/>

帮助。