XSLT将spring bean添加到beans.xml

时间:2016-12-17 17:35:18

标签: xml xslt xml-namespaces

我是xslt的新手。 我需要将spring bean添加到xml中,以防它还不存在。 所以我尝试了下一个代码(我使用ant运行此代码):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" encoding="UTF-8" />
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="/*">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
            <xsl:if test="not(bean[@class='com.mysite.MyCustomController'])">
                <bean class="com.mysite.MyCustomController"/>
            </xsl:if>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

它可以工作,但添加了带有xmlns属性的元素,所以它在最终的XML文件中看起来像这样:

<bean xmlns="" class="com.mysite.MyCustomController"/>

我希望结果没有xmlns属性,所以我搜索了我的xsl代码转到:

...
<xsl:if test="not(bean[@class='com.mysite.MyCustomController'])">
    <bean class="com.mysite.MyCustomController" xmlns="http://www.springframework.org/schema/beans"/>
</xsl:if>
...

现在结果XML看起来很好:

<bean class="com.mysite.MyCustomController"/>

但! IF条件不起作用。每次运行代码时都会添加相同的bean。

我的xsl错了吗? 感谢。

2 个答案:

答案 0 :(得分:1)

您的XML包含命名空间http://www.springframework.org/schema/beans中的元素。您检查并将元素添加到默认命名空间(“”)。为了使事情有效,您需要修改代码

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:bn="http://www.springframework.org/schema/beans"
  exclude-result-prefixes="bn">
  ..........
     <xsl:if test="not(bn:bean[@class='com.mysite.MyCustomController'])">
       <bean class="com.mysite.MyCustomController"
             xmlns="http://www.springframework.org/schema/beans"/>
     </xsl:if>
  .............
</xsl:stylesheet>

答案 1 :(得分:0)

正确的代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:bn="http://www.springframework.org/schema/beans">
    <xsl:output method="xml" indent="yes" encoding="UTF-8" />
    <xsl:attribute-set name="bean-attr-list">
        <xsl:attribute name="class">com.mysite.MyCustomController</xsl:attribute>
    </xsl:attribute-set>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="/*">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
            <xsl:if test="not(bn:bean[@class='com.mysite.MyCustomController'])">
                <xsl:element name="bean" namespace="http://www.springframework.org/schema/beans" use-attribute-sets="bean-attr-list" />
            </xsl:if>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>