[英]Mule XSLT Transformer is adding namespace after transformation
问题:我正在尝试将uuid作为新元素添加到传入的xml消息中。 我可以在记录结果时看到添加的内容,但是mule将其名称空间和java util uuid名称空间添加到结果中,这导致另一个服务在我路由此消息时将其识别,因为它具有一个没有名称空间的名称空间知道关于。
有没有一种方法可以配置xslt转换器来实现我在这里试图做的事情? 还有其他建议可以替代吗?
目标是让xslt生成一个uuid并将其标记在传入消息上,并将其传递到服务端点。 感谢所有这方面的帮助。
ule子配置:
<mule xmlns:mulexml="http://www.mulesoft.org/schema/mule/xml"
xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking"
xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core"
xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
xmlns:spring="http://www.springframework.org/schema/beans" version="EE-3.4.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:billing="http://mycompany.com/billing"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd
http://www.mulesoft.org/schema/mule/xml http://www.mulesoft.org/schema/mule/xml/current/mule-xml.xsd">
<mulexml:xslt-transformer name="xslt"
doc:name="XSLT">
<mulexml:xslt-text>
<xsl:stylesheet version="2.0" xmlns:uuid="java:java.util.UUID">
<xsl:variable name="uid" select="uuid:randomUUID()" />
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="Request">
<Request>
<xsl:apply-templates select="node()|@*" />
<RequestId>
<xsl:value-of select="$uid" />
</RequestId>
</Request>
</xsl:template>
</xsl:stylesheet>
</mulexml:xslt-text>
</mulexml:xslt-transformer>
<flow name="rsi_invoiceFlow1" doc:name="rsi_invoiceFlow1">
<http:inbound-endpoint exchange-pattern="request-response"
address="${listener.hostname}:${listener.port}/${listener.path.invoice.rsi}"
doc:name="HTTP" transformer-refs="xslt" />
<logger message="#[message.payloadAs(java.lang.String)]" level="ERROR"
doc:name="Logger" />
<http:outbound-endpoint exchange-pattern="request-response"
method="POST" address="${destination.dev2.url}/" doc:name="HTTP"
doc:description="The '/' at the end of the URL is required on the RSI outbound call" />
</flow>
</mule>
传入XML:
<?xml version="1.0" encoding="UTF-8"?>
<billing:RQ xmlns:billing="http://mycompany.com/billing">
<Request>
<CallingHostOrWeblogicInstance>SOAPUI</CallingHostOrWeblogicInstance>
</Request>
输出:
<?xml version="1.0" encoding="UTF-8"?>
<billing:RQ xmlns:billing="http://mycompany.com/billing">
<Request xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:uuid="java:java.util.UUID"><CallingHostOrWeblogicInstance xmlns="">SOAPUI</CallingHostOrWeblogicInstance>
<RequestId>bff3e1d6-ecdd-41ae-8807-ec04085a2b54</RequestId>
</Request>
XSLT在有效的默认名称空间中创建没有指定名称空间的新元素。
在您的情况下,默认名称空间声明为xmlns="http://www.mulesoft.org/schema/mule/core"
,因此,您输出的<Request>
元素将位于该名称空间中。
一种方法是完全避免使用默认名称空间。 而是使用前缀xmlns:mule="http://www.mulesoft.org/schema/mule/core"
,然后使用<mule:mule>
, <mule:flow>
, <mule:logger>
等。使用m:
if你发现mule:
太长了。
那可能是最干净的方法。 无论如何,您已经在使用大量其他名称空间,明确声明该名称空间不会受到损害。
另一个变体是将XSLT声明中的默认名称空间重置为空:
<xsl:stylesheet
version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:uuid="java:java.util.UUID"
xmlns=""
>
<!-- ... -->
</xsl:stylesheet>
您也可以使用<xsl:copy>
而不是显式创建新的<Request>
-,但是<RequestId>
仍然会遇到相同的问题。 <RequestId xmlns="">
可以解决此问题,但这相当难看,尤其是如果它不是您创建的唯一元素时。
如果您不想外部化XSLT(如David所建议的),我建议使用“无默认名称空间”方法。
不要将XSL嵌入Mule配置本身,而是存储在独立文件中。 您将避免名称空间污染,这是最佳实践。
在xsl:stylesheet元素上使用xmlns =“”重置默认名称空间。
在xsl:stylesheet元素中使用exclude-result-prefixes可以避免其他m子名称空间泄漏到样式表中。
(您也可以使用为此目的而发明的XML 1.1“名称空间未声明”,但我不会这样做:XML 1.1并未得到广泛支持,不足以使该技术变得可靠。)
我尝试了所有3条建议,并且我认为将转换与流配置分开是最适合我的情况的方法,因为它提供了最干净,分离的方法来解决此问题。
谢谢大家的回复。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.