我正在尝试使用以下XSLT来转换xml文档的内容。但是,我的一个元素是使用以前的命名空间复制的,而不是所需的。见下文。
<?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="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="cd:ArrayOfMachine">
<Inventory>
<Schema>2018</Schema>
<Machines>
<xsl:apply-templates select="@*|node()" />
</Machines>
</Inventory>
</xsl:template>
</xsl:stylesheet>
输入:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfMachine xmlns="http://schemas.datacontract.org/2004/07/CMachine" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Machine>
<Price>120000</Price>
<Properties>
<Axes>XYZ</Axes>
</Properties>
</Machine>
</ArrayOfMachine>
输出:
<?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 xmlns="http://schemas.datacontract.org/2004/07/CMachine">
<Price>120000</Price>
<Properties>
<Axes>XYZ</Axes>
</Properties>
</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>
<Axes>XYZ</Axes>
</Properties>
</Machine>
</Machines>
</Inventory>
XSLT需要进行哪些调整才能解决此问题? 任何帮助将不胜感激!
答案 0 :(得分:1)
当您使用xsl:copy
时,它将复制节点及其命名空间。如果要生成具有相同local-name()
的元素并删除命名空间,则需要创建新元素。您可以创建模板以匹配所有元素并生成通用(无命名空间)元素,然后使常规标识模板仅匹配属性,text(),comment()和processing-instruction()节点:
<?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="*" />
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*|text()|comment()|processing-instruction()">
<xsl:copy/>
</xsl:template>
<xsl:template match="cd:ArrayOfMachine">
<Inventory>
<Schema>2018</Schema>
<Machines>
<xsl:apply-templates select="@*|node()" />
</Machines>
</Inventory>
</xsl:template>
</xsl:stylesheet>