XSLT转换在Jboss Developer studio 7.1中表现不同,并且junit失败
问题描述:
我有一个xml并需要提取消息的某些部分。当使用Jboss Developer studio 7.1默认xslt处理器时,命名空间被删除,但它正在创建命名空间当使用在线工具和altova。 Junit测试因此失败。 你能帮我吗。XSLT转换在Jboss Developer studio 7.1中表现不同,并且junit失败
输入:
<response>
<esb-metadata>
<user-id>Cube</user-id>
<service-name>Pricing</service-name>
<source-system-id>Cube001</source-system-id>
<source-transaction-id>1234567</source-transaction-id>
<environment>DEV</environment>
<message-type>RES</message-type>
<result>DONE</result>
<correlation-id>123456789</correlation-id>
</esb-metadata>
<message-body>
<rating-pricing-response xmlns="urn:company:esb:services:RatingPricing:v01">
<account_final_rp_rate>10</account_final_rp_rate>
<account_final_bpp_rate>5</account_final_bpp_rate>
<account_final_te_rate>15</account_final_te_rate>
<group1_base_rate>9</group1_base_rate>
<group2_base_rate>7</group2_base_rate>
<state_group1_factor>5</state_group1_factor>
<csp_group1_table_value>45</csp_group1_table_value>
<loc_age_factor>10</loc_age_factor>
<loc_sprinkler_group1>15</loc_sprinkler_group1>
<loc_ded_factor>145</loc_ded_factor>
<loc_fire_calibration>654</loc_fire_calibration>
<loc_Modelled_cat_factor>44</loc_Modelled_cat_factor>
<account_final_benchmark_rate>6</account_final_benchmark_rate>
</rating-pricing-response>
</message-body>
</response>
XSLT:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="urn:company:esb:services:RatingPricing:v01">
<xsl:output indent="yes" method="xml" encoding="utf-8"
omit-xml-declaration="yes" />
<!-- template to copy elements -->
<xsl:template match="/">
<xsl:for-each select="//message-body">
<xsl:apply-templates select="@* | node()" />
</xsl:for-each>
</xsl:template>
<!-- template to copy elements -->
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@* | node()" />
</xsl:element>
</xsl:template>
<!-- template to copy attributes -->
<xsl:template match="@*">
<xsl:attribute name="{local-name()}"><xsl:value-of select="." /></xsl:attribute>
</xsl:template>
<!-- template to copy the rest of the nodes -->
<xsl:template match="comment() | text() | processing-instruction()">
<xsl:copy />
</xsl:template>
</xsl:stylesheet>
预期输出:
<rating-pricing-response xmlns="urn:company:esb:services:RatingPricing:v01">
<account_final_rp_rate>10</account_final_rp_rate>
<account_final_bpp_rate>5</account_final_bpp_rate>
<account_final_te_rate>15</account_final_te_rate>
<group1_base_rate>9</group1_base_rate>
<group2_base_rate>7</group2_base_rate>
<state_group1_factor>5</state_group1_factor>
<csp_group1_table_value>45</csp_group1_table_value>
<loc_age_factor>10</loc_age_factor>
<loc_sprinkler_group1>15</loc_sprinkler_group1>
<loc_ded_factor>145</loc_ded_factor>
<loc_fire_calibration>654</loc_fire_calibration>
<loc_Modelled_cat_factor>44</loc_Modelled_cat_factor>
<account_final_benchmark_rate>6</account_final_benchmark_rate>
</rating-pricing-response>
实际输出:
<rating-pricing-response>
<account_final_rp_rate>10</account_final_rp_rate>
<account_final_bpp_rate>5</account_final_bpp_rate>
<account_final_te_rate>15</account_final_te_rate>
<group1_base_rate>9</group1_base_rate>
<group2_base_rate>7</group2_base_rate>
<state_group1_factor>5</state_group1_factor>
<csp_group1_table_value>45</csp_group1_table_value>
<loc_age_factor>10</loc_age_factor>
<loc_sprinkler_group1>15</loc_sprinkler_group1>
<loc_ded_factor>145</loc_ded_factor>
<loc_fire_calibration>654</loc_fire_calibration>
<loc_Modelled_cat_factor>44</loc_Modelled_cat_factor>
<account_final_benchmark_rate>6</account_final_benchmark_rate>
</rating-pricing-response>
答
由于您明确使用<xsl:element name="{local-name()}">
在结果文件中构建元素,因此将它们放在没有名称空间中是正确的。如果您希望从输入文档保留名称空间,请使用<xsl:copy>
。如果您希望名称空间urn:company:esb:services:RatingPricing:v01
中的输出与输入无关,请将namespace="urn:company:esb:services:RatingPricing:v01"
添加到xsl:element
指令中。