gpt4 book ai didi

xml - 使用 xslt 将元素复制到新的命名空间

转载 作者:行者123 更新时间:2023-12-04 17:02:11 24 4
gpt4 key购买 nike

我正在尝试更改 XML 文件的命名空间。我很接近但是根元素有一个小问题。

XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:cd="http://schemas.datacontract.org/2004/07/CMachine" xmlns="http://schemas.datacontract.org/2004/07/CMachine.DataContracts" exclude-result-prefixes="cd">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />
<!-- Identify transform -->
<xsl:template match="@*|text()|comment()|processing-instruction()">
<xsl:copy/>
</xsl:template>
<!-- Create a new element in the new namespace for all elements -->
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

输入:
<?xml version="1.0" encoding="utf-8"?>
<Inventory xmlns="http://schemas.datacontract.org/2004/07/CMachine" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Schema>2018</Schema>
<Machines>
<Machine>
<Price>120000</Price>
<Properties i:nil="true" />
</Machine>
</Machines>
</Inventory>

输出:
<?xml version="1.0" encoding="utf-8"?>
<Inventory xmlns="http://schemas.datacontract.org/2004/07/CMachine.DataContracts">
<Schema>2018</Schema>
<Machines>
<Machine>
<Price>120000</Price>
<Properties i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" />
</Machine>
</Machines>
</Inventory>

期望的输出:
<?xml version="1.0" encoding="utf-8"?>
<Inventory xmlns="http://schemas.datacontract.org/2004/07/CMachine.DataContracts" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" >
<Schema>2018</Schema>
<Machines>
<Machine>
<Price>120000</Price>
<Properties i:nil="true" />
</Machine>
</Machines>
</Inventory>

我需要做哪些调整才能正确地进行 XML 输入转换?

最佳答案

有几种方法可以将 namespace 声明(此处为 xmlns:i)放在实际未使用的元素上(以元素的名称或其任何属性的名称)。

在 XSLT 2.0 中,您可以使用 xsl:namespace 指令。

  <xsl:template match="/*">
<xsl:element name="{local-name()}">
<xsl:namespace name="i" select="'http://www.w3.org/2001/XMLSchema-instance'"/>
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>

在这种特殊情况下,命名空间存在于源文档中,因此您可以复制它(这也适用于 XSLT 1.0):
  <xsl:template match="/*">
<xsl:element name="{local-name()}">
<xsl:copy-of select="namespace::i"/>
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>

关于xml - 使用 xslt 将元素复制到新的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46533579/

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