XSLT - 将命名空间添加到输出

时间:2012-05-30 08:47:57

标签: xml xslt namespaces

我正在尝试生成XML输出,并且我创建了一个XSLT,它将这样做。但是根节点缺少一些名称间距。如何将Namespace添加到XML结构的根元素。这就是我正在使用的XSLT:

XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:doc="urn:sapcom:document:sap:rfc:functions" xmlns:r="http://www.castiron.com/response" exclude-result-prefixes="r">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <xsl:element name="imageScene7Request">
            <xsl:element name="productIds">
                <xsl:for-each select="r:productGetAllByIdsResponse/r:payload/r:products">
                    <xsl:value-of select="r:id"/>
                    <xsl:if test="position() != last()">
                        <xsl:text>,</xsl:text>
                    </xsl:if>
                </xsl:for-each>
            </xsl:element>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

命名空间我想添加到根http://www.castiron.com/response

INPUT XML

<?xml version="1.0" encoding="UTF-8"?>
<productGetAllByIdsResponse xmlns="http://www.castiron.com/response">
    <rcode>0</rcode>
    <rmessage>Success</rmessage>
    <payload>
        <products>
            <id>4022280</id>
        </products>
        <products>
            <id>4022280</id>
        </products>
    </payload>
</productGetAllByIdsResponse>

你会看到,当你运行时,它会给你:

<?xml version="1.0" encoding="utf-8"?>
<imageScene7Request>
    <productIds>4022280,4022280</productIds>
</imageScene7Request>

但是我想这样:

<?xml version="1.0" encoding="utf-8"?>
<imageScene7Request xmlns="http://www.castiron.com/response">
    <productIds>4022280,4022280</productIds>
</imageScene7Request>

回复@dbaseman

然而它工作了,然后它给第二个标签一个空名称空间,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<imageScene7Request xmlns="http://www.castiron.com/response">
    <productIds xmlns="">4022280,4022280</productIds>
</imageScene7Request>

有没有办法删除它?

3 个答案:

答案 0 :(得分:3)

由于您静态地知道结果元素的名称是什么,因此使用文字结果元素而不是xsl:element会好得多:

 <xsl:template match="/">
    <imageScene7Request xmlns="http://www.castiron.com/response">
        <productIds>
            <xsl:for-each select="r:productGetAllByIdsResponse/r:payload/r:products">
                <xsl:value-of select="r:id"/>
                <xsl:if test="position() != last()">
                    <xsl:text>,</xsl:text>
                </xsl:if>
            </xsl:for-each>
        </productIds>
    </imageScene7Request>
</xsl:template>

如果您确实使用xsl:element,则需要确保使用namespace属性来确保该元素位于正确的命名空间中。

答案 1 :(得分:2)

我认为你只需要在样式表中明确指定命名空间:

<xsl:element name="imageScene7Request" namespace="http://www.castiron.com/response">
    <xsl:element name="productIds">
       ...
    </xsl:element>
</xsl:element>

答案 2 :(得分:1)

这有用吗?

<xsl:stylesheet xmlns="http://www.castiron.com/response" ...>

这会将XSLT中所有元素的名称空间设置为http://www.castiron.com/response