当前位置: 首页 > 知识库问答 >
问题:

XSLT 1.0如何将命名空间声明保留在根位置

章飞章
2023-03-14

我正在使用XSLT1.0(因为处理软件不支持2.0),我一直在寻找一种方法,使输出xml上的所有名称空间定义都放在根节点上。有人知道怎么做吗?

下面是一个小例子,说明我正在做什么,我得到了什么,我追求的是什么:

<document Version="1.4">
<Series>A</Series>
<Folio>321</Folio>
<Date>2017-05-05T01:00:00</Date>
<Complement>
    <Other>
        <Version>4.2</Version>
        <Type>K</Type>
        <PaymentDate>2016-12-13</PaymentDate> 
    </Other>
</Complement>
</document>

我得XSLT:

<xsl:stylesheet extension-element-prefixes="xsi" version="1.0" xmlns:A="http://example.com/A" xmlns:C="http://example.com/C" xmlns:local="urn:local" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:B="http://example.com/B" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsi:schemaLocation="http://example.com/A http://example.com/A/A.xsd">
<xsl:output encoding="UTF-8" indent="yes" method="xml" version="1.0" omit-xml-declaration="yes"/>
<xsl:template match="/">
    <xsl:element name="A:Document">
        <xsl:attribute name="Version">
            <xsl:text>9.1</xsl:text>
        </xsl:attribute>
        <xsl:if test="/document/Series/node() and /document/Series != ''">
            <xsl:attribute name="Series">
                <xsl:value-of select="/document/Series"/>
            </xsl:attribute>
        </xsl:if>
        <xsl:if test="/document/Folio/node() and /document/Folio != ''">
            <xsl:attribute name="Folio">
                <xsl:value-of select="/document/Folio"/>
            </xsl:attribute>
        </xsl:if>
        <xsl:attribute name="Date">
            <xsl:value-of select="/document/Date"/>
        </xsl:attribute>
        <xsl:if test="/document/Complement/Other/node() or /document/Complement/Another/node()">
            <xsl:element name="A:Complement">
                <xsl:if test="/document/Complement/Other/node()">
                    <xsl:element name="B:Payment">
                        <xsl:call-template name="B:Payment">
                            <xsl:with-param name="Node" select="/document/Complement/Other"/>
                        </xsl:call-template>
                    </xsl:element>
                </xsl:if>
            </xsl:element>
        </xsl:if>
    </xsl:element>
</xsl:template>
<!--- COMPLEMENT-->
<xsl:template name="B:Payment">
    <xsl:param name="Node"/>
    <xsl:attribute name="Version">
        <xsl:value-of select="$Node/Version"/>
    </xsl:attribute>
    <xsl:attribute name="Type">
        <xsl:value-of select="$Node/Type"/>
    </xsl:attribute>
    <xsl:attribute name="PaymentDate">
        <xsl:value-of select="$Node/PaymentDate"/>
    </xsl:attribute>
</xsl:template>
</xsl:stylesheet>

输出:

<A:Document Version="9.1" Series="A" Folio="321" Date="2017-05-05T01:00:00" xmlns:A="http://example.com/A">
    <A:Complement>
        <B:Payment Version="4.2" Type="K" PaymentDate="2016-12-13" xmlns:B="http://example.com/B" />
    </A:Complement>
</A:Document>

我需要的:

<A:Document Version="9.1" Series="A" Folio="321" Date="2017-05-05T01:00:00" xmlns:A="http://example.com/A" xmlns:B="http://example.com/B">
    <A:Complement>
        <B:Payment Version="4.2" Type="K" PaymentDate="2016-12-13" />
    </A:Complement>
</A:Document>
    null

我是一个XSLT新手,因此我将非常感谢任何有关此方面的帮助(或一些我可以学习如何这样做的文献的指导)

共有1个答案

傅鸿波
2023-03-14

我建议您将文字结果元素与IE一起使用。

<xsl:template match="/">
    <A:Document>

那么您只需要exclude-result-prefixes=“xsi C local msxsl”,即。

<xsl:stylesheet exclude-result-prefixes="xsi C local msxsl" version="1.0" xmlns:A="http://example.com/A" xmlns:C="http://example.com/C" xmlns:local="urn:local" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:B="http://example.com/B" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsi:schemaLocation="http://example.com/A http://example.com/A/A.xsd">

这样XSLT处理器就会输出

<A:Document xmlns:A="http://example.com/A" xmlns:B="http://example.com/B" Version="9.1" Series="A" Folio="321" Date="2017-05-05T01:00:00">

关于资源和教程,有一本书可以在网上免费下载,网址是https://cranesoftwrights.github.io/books/ptux/。

 类似资料:
  • 我有困难建立一个有3个类的结构。我不确定包含/转发声明。 下面的代码一直在编译,直到我在inclino.h中添加名称空间和枚举。我从Inclinomeasure.h收到“Inclino尚未声明”。 倾斜度。h 倾斜度 倾角读数.h 结构正确吗?如何访问其他类中的枚举? 提前道谢。 编辑:我修复了名称空间的问题,把它放在一个新的文件,包括由3类。但我似乎误用了include/forward声明。

  • 我试图在头文件中使用前向声明来减少#includes used,从而减少用户包含我的头文件时的依赖关系。 但是,我无法在使用名称空间的地方转发decalre。参见下面的示例。 这里是我非常做作的工作代码使用下面的答案。

  • 问题内容: 如何在JavaScript中创建名称空间,以使我的对象和函数不会被其他同名对象和函数覆盖?我使用了以下内容: 有没有更优雅或更简洁的方法? 问题答案: 我喜欢这个:

  • 我正在创建一个基于以下代码的动态sitemap.xml 这是可行的,但Google不高兴“urlset”节点中没有Namespace声明。Google错误:“您的Sitemap或Sitemap索引文件未声明预期的命名空间:http://www.sitemaps.org/schemas/sitemap/0.9" 如果我将代码更改为: 它无法生成xml文件并引用以下内容: 在测试中,我发现节点需要一个

  • 如何在命名空间中转发声明类。例如,下面是一个库的头文件,用户不需要知道私有的myPtr,所以当包含在头文件下面时,不需要包含boost头文件。那么我如何向前声明boost::shared_ptr以启用用户代码编译呢? MyClass.h

  • 这是一个非常基本的问题,但实际上我从来没有自己定义过名称空间。我正在尝试将我的基于Qt的库中的类分组在各种名称空间中(并且还允许更容易的扩展而不发生名称冲突)。例如,主类(也表示库)属于顶级命名空间: 这个使用了一组其他名称空间和类,这些名称空间和类是在的头文件中定义的,这些头文件包含在的头文件中: 其中Manager.h包含 和configurator.h包含 类的内容在这里并不重要。 在编译时