0

我正在尝试使用 XSLT 将一段 XML 添加到输入 XML。但是输出并没有像预期的那样出现。请帮忙。

我的输入 XML :

    <input  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:noNamespaceSchemaLocation="nbA2.8.90.xsd">
        <nodeA id="test">
            <inodeAA> Sample </inodeAA>
            <inodeAB> Samples </inodeAB>
        </nodeA>
        <nodeB id="test">
            <inodeBA> Sample </inodeBA>
            <inodeBB> Samples </inodeBB>
        </nodeB>
    </input>

下面是另一个 XML 片段,我将其作为参数传递给我 XSLT。这段将被添加到输入 XML 中:

    <ns3:output xmlns:ns3="http://mysample.org">
        <ns3:reply id="rep">
            <ns3:zip>55555</ns3:zip>
            <ns3:place>SampleLoc</ns3:place>
        </ns3:reply>
    </ns3:output>

以下是我的预期输出:

    <input xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:noNamespaceSchemaLocation="nbA2.8.90.xsd">
        <nodeA id="test">
            <inodeAA> Sample </inodeAA>
            <inodeAB> Samples </inodeAB>
        </nodeA>
        <nodeB id="test">
            <inodeBA> Sample </inodeBA>
            <inodeBB> Samples </inodeBB>
        </nodeB>

        <ns3:output xmlns:ns3="http://mysample.org">
            <ns3:reply id="rep">
                <ns3:zip>55555</ns3:zip>
                <ns3:place>SampleLoc</ns3:place>
            </ns3:reply>
        </ns3:output>

    </input>

以下是我用于此任务的 XSL:

在下面的 XSLT 中,参数“outParam”包含我试图添加到我输入的 xml 片段。

    <xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns:ns3="http://mysample.org"
        exclude-result-prefixes="soap xsl">
        <xsl:output omit-xml-declaration="yes" indent="yes" />

        <xsl:param name="outParam"></xsl:param>

        <xsl:template match="input">
            <input>
                <xsl:copy-of copy-namespaces="no" select="./@*" />
                <xsl:copy-of copy-namespaces="no" select="node() | @*" />
            </input>
            <xsl:copy >
                <xsl:value-of select="$outParam" disable-output-escaping="yes" ></xsl:value-of>
            </xsl:copy>
        </xsl:template> 
    </xsl:stylesheet>

下面是我得到的输出。这与我的预期输出不符。

    <input xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:ns3="http://mysample.org"  
        xsi:noNamespaceSchemaLocation="nbA2.8.90.xsd" >
        <nodeA id="test">
            <inodeAA> Sample </inodeAA>
            <inodeAB> Samples </inodeAB>
        </nodeA>
        <nodeB id="test">
            <inodeBA> Sample </inodeBA>
            <inodeBB> Samples </inodeBB>
        </nodeB>
    </input>
    <input xmlns:xsd="http://www.w3.org/2001/XMLSchema"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">   
        <ns3:output xmlns:ns3="http://mysample.org">
            <ns3:reply id="rep">
                <ns3:zip>55555</ns3:zip>
                <ns3:place>SampleLoc</ns3:place>
            </ns3:reply>
        </ns3:output>
    </input>

请帮忙。我尝试了很多组合,但没有运气。:(

注意:我正在使用 Mule XSLT 转换器执行此转换,该转换器基于提供的 XSLT 转换有效负载 XML。

4

2 回答 2

2

如果参数是一个节点或节点序列,您只需要

<xsl:template match="input">
  <xsl:copy>
     <xsl:copy-of select="@* , node(), $outParam"/>
  </xsl:copy>
</xsl:template>

如果传入的参数是带有 XML 标记的字符串,那么您需要

<xsl:template match="input">
  <xsl:copy>
    <xsl:copy-of select="@*, node()"/>
    <xsl:value-of select="$outParam" disable-output-escaping="yes"/>
  </xsl:copy>
</xsl:template>
于 2012-12-13T16:13:29.560 回答
1

如果 EXSLT 是一个选项,添加xmlns:exsl="http://exslt.org/common"并尝试

    <xsl:template match="input">
        <input>
            <xsl:copy-of copy-namespaces="no" select="./@*" />
            <xsl:copy-of copy-namespaces="no" select="node() | @*" />
            <xsl:copy-of select="exsl:node-set($outParam)/*" />
        </input>
    </xsl:template> 
于 2012-12-13T16:11:37.450 回答