XSLT:如何在有序列表中添加元素

时间:2015-10-08 15:11:48

标签: xml xslt

我已经制作了一个xslt脚本来在列表的末尾添加一个元素,如果它还没有存在,它就可以了。但是如何保持订单的排序?

这是剧本:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:util="http://www.springframework.org/schema/util"
                xmlns:beans="http://www.springframework.org/schema/beans"
                xmlns:p="http://www.springframework.org/schema/p">

    <xsl:output encoding="UTF-8" omit-xml-declaration="no" indent="yes"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:param name="ident"></xsl:param>

    <xsl:template match="beans:bean[@id='messagePool']/beans:property[@name='queueNames']/util:list">
        <xsl:copy>
            <xsl:copy-of select="@*|node()"/>
            <xsl:if test="not(beans:value[text() = concat('QL.', $ident, '.0')])">
                <value>QL.<xsl:value-of select="$ident"/>.0</value>
            </xsl:if>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

这是数据文件:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd">
    <bean id="messagePool" class="com.example.QueueConfig"
          p:recoveryInterval="1">
        <property name="queueNames">
            <util:list>
                <value>QL.00000001.0</value>
                <value>QL.00000002.0</value>
                <value>QL.00000040.0</value>
                <value>QL.00000045.0</value>
            </util:list>
        </property>
    </bean>
</beans>

生成的XML是:

<bean id="messagePool" class="com.example.QueueConfig" p:recoveryInterval="1">
    <property name="queueNames">
        <util:list>
            <value>QL.00000001.0</value>
            <value>QL.00000002.0</value>
            <value>QL.00000040.0</value>
            <value>QL.00000045.0</value>
            <value xmlns="">QL.00000003.0</value>
        </util:list>
    </property>
</bean>

QL.00000003.0的元素应该放在QL.00000002.0之后。

作为一个额外的问题:如何摆脱假的xmlns =“”?

1 个答案:

答案 0 :(得分:2)

使用XSLT 1.0,您可以首先创建一个结果树片段,并在末尾添加值,然后将其转换为使用exsl:node-set(或类似,取决于您的XSLT处理器)的节点集并处理它排序顺序:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns="http://www.springframework.org/schema/beans"
                xmlns:util="http://www.springframework.org/schema/util"
                xmlns:beans="http://www.springframework.org/schema/beans"
                xmlns:p="http://www.springframework.org/schema/p"
                xmlns:exsl="http://exslt.org/common"
                exclude-result-prefixes="exsl beans">

    <xsl:output encoding="UTF-8" omit-xml-declaration="no" indent="yes"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:param name="ident">00000003</xsl:param>

    <xsl:template match="beans:bean[@id='messagePool']/beans:property[@name='queueNames']/util:list">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:variable name="new-values">
                <xsl:copy-of select="beans:value"/>
                <xsl:if test="not(beans:value[text() = concat('QL.', $ident, '.0')])">
                    <value>QL.<xsl:value-of select="$ident"/>.0</value>
                </xsl:if>
            </xsl:variable>
            <xsl:apply-templates select="exsl:node-set($new-values)/*">
                <xsl:sort select="."/>
            </xsl:apply-templates>

        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

我还在样式表中添加了xmlns="http://www.springframework.org/schema/beans",以确保在正确的命名空间中创建新元素,以便不会出现xmlns=""