我已经制作了一个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 =“”?
答案 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=""
。