xsl生成带前缀的属性

时间:2014-10-14 09:59:24

标签: xslt namespaces prefix

我对XSL完全陌生并且负责使用xmlns生成输出xml:A.B.C前缀/值作为根节点的属性。特别是这样:

<GetVersionResponse xmlns:A.B.C="www.somesite.co.uk/A/B/C">
    <Class>GetVersionRequest</Class>
    <Errors>
        <Error>
            <Text>Some message</Text>
        </Error>
    </Errors>
</GetVersionResponse>

这是我的意见:

<Error>
    <Namespace>xmlns:A.B.C</Namespace>
    <NamespaceValue>www.somesite.com/A/B/C</NamespaceValue>
    <Class>GetVersionRequest</Class>
    <Message>Some message</Message>
</Error>

这是Error.xsl文件的重要摘录:

<xsl:template match="Error">                    
    <xsl:variable name="ResponseType">
        <xsl:value-of select="concat(substring-before(Class, 'Request'),'Response')"/>
    </xsl:variable>        
    <xsl:variable name="NS">
        <xsl:value-of  select="Namespace"/>
    </xsl:variable>
    <xsl:variable name="NSV">
        <xsl:value-of  select="NamespaceValue"/>
    </xsl:variable>

    <xsl:element name="{$ResponseType}" namespace="{$NSV}" xml:space="default">
    ...
</xsl:template 

它会生成以下错误,因为我在输入的Namespace元素中有一个冒号:

XSLT 2.0调试错误:未知的名称空间前缀

如果我用下划线替换冒号,我会得到我需要的确切输出,但当然只有下划线。像这样:

<GetVersionResponse xmlns_A.B.C="www.somesite.co.uk/A/B/C">
    <Class>GetVersionRequest</Class>
    <Errors>
        <Error>
            <Text>Some message</Text>
        </Error>
    </Errors>
</GetVersionResponse>

我已经在网上搜了几个小时,并且认为我试图插入xmlns:作为文本,而不是使用将生成xmlns的正确对象:MYTEXT但无法弄清楚如何操作。< / p>

非常感谢您的帮助!!!!

1 个答案:

答案 0 :(得分:3)

这里的复杂因素是xmlns:...名称空间声明属于而不是属性,就XPath数据模型而言,因此您无法使用{{1}创建它们}。但是,在XSLT 2.0中,您可以使用xsl:namespace创建它们。

xsl:attribute

Live demo

<xsl:template match="Error"> <xsl:element name="{substring-before(Class, 'Request')}Response"> <xsl:namespace name="{substring-after(Namespace, 'xmlns:')}" select="NamespaceValue" /> <xsl:copy-of select="Class" /> <Errors> <Error> <Text><xsl:value-of select="Message" /></Text> </Error> </Errors> </xsl:element> </xsl:template> 的{​​{1}}属性是您要绑定的前缀(因此包括name),xsl:namespace给出了要绑定到的URI。