繁体   English   中英

Mule XSLT Transformer在转换后添加名称空间

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM