gpt4 book ai didi

xml - XSLT 1.0 如何在根目录中保留 namespace 声明

转载 作者:行者123 更新时间:2023-12-04 16:51:21 25 4
gpt4 key购买 nike

我正在使用 XSLT 1.0(因为处理软件不支持 2.0)并且我一直在寻找一种方法来将输出 xml 上的所有命名空间定义放在根节点上。任何人都知道如何做到这一点?

这是我正在做什么,我得到了什么以及我所追求的一个小例子:

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

如您所见,我需要的是将两个命名空间声明都保留在根节点(根据将处理此 XML 的软件的要求)

一些附加信息:
  • 如前所述,我只能使用 XSLT 1.0,因为这是我可以使用的当前工具唯一支持的工具(有计划改变这一点,但不会在不久的将来完成)
  • 这必须完全使用 XSLT
  • 完成
  • 正如您可能从示例中推断出的那样,“其他”节点是可选的,因此它可以存在(在这种情况下输出中的命名空间是必需的)或不存在(在这种情况下,命名空间声明不应该存在)
  • 这种“可选”节点还有很多,每个节点都有自己的命名空间
  • 不过,它不一定只有 1 个 XSLT,如果可以通过将输出传递给新的 XSLT 来解决这个问题,那将可以正常工作

  • 我是 XSLT 新手,因此,如果对此有任何帮助(或我可以学习如何执行此操作的某些文献的方向),将不胜感激

    最佳答案

    我建议您使用文字结果元素,即

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

    仅使用 xsl:element如果您需要在运行时计算元素名称或命名空间。

    至于资源和教程,我们现在免费在线提供一本书 https://cranesoftwrights.github.io/books/ptux/ .

    关于xml - XSLT 1.0 如何在根目录中保留 namespace 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46894126/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com