xslt - xsl 生成带前缀的属性

标签 xslt namespaces prefix

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

<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 但不知道如何去做。

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

最佳答案

这里的复杂因素是 xmlns:...就 XPath 数据模型而言, namespace 声明不是属性,因此您不能使用 xsl:attribute 创建它们。 .但是,在 XSLT 2.0 中,您可以使用 xsl:namespace 创建它们。 .

<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>

Live demo
name xsl:namespace 的属性是您要绑定(bind)的前缀(因此不包括 xmlns: ),以及 select给出你想要绑定(bind)到的 URI。

关于xslt - xsl 生成带前缀的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26357926/

相关文章:

jquery - XSLT 两列无序列表

java - 如何拦截 SOAP 消息并在处理之前对其进行转换?

namespaces - WCF REST POST XML

使用对象和自执行匿名函数的 jQuery 命名空间

php - XSLT 2.0 PHP 支持。什么时候?

xml - XSL :copy-of How to copy some attributes from a node?

php - 是否有最佳实践方法来近似 WordPress 插件中的命名空间 PHP?

unicode - 英特尔C编译器和L”前缀

c++ - 需要帮助了解递归前缀计算器

c - 使用 C 中的队列评估前缀操作