xml - 在 XSLT 转换期间删除 XML 名称空间?
问题描述
我需要从输入 XML 中删除名称空间,并保持当前处理消除子节点并将数据移动到 XSLT 中的父节点。基于各种线程,我尝试通过定义另一个命名空间来删除命名空间,但我无法获得所需的输出。
以下用于消除子节点和移动数据的 XSLT 代码正在运行,但用于删除命名空间的代码不起作用。
XSLT 代码 -
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:bc="urn:com.matrix/bc"
xmlns:test="urn:com.matrix/test"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
exclude-result-prefixes="bc test">
<xsl:output method="xml" 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="@*">
<xsl:attribute name="{local-name(.)}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="bc:PersonData">
<xsl:copy>
<xsl:apply-templates select="bc:Person"/>
</xsl:copy>
</xsl:template>
<xsl:template match="bc:Person">
<xsl:copy>
<xsl:copy-of select="*/*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
输入 XML -
<?xml version="1.0" encoding="ISO-8859-1"?>
<bc:PersonData xmlns:bc="urn:com.matrix/bc">
<bc:Header>
<data1>abc</data1>
<data2>def</data2>
</bc:Header>
<bc:Person>
<bc:Personal>
<bc:FirstName>abc</bc:FirstName>
<bc:LastName>cde</bc:LastName>
<bc:ID>12345</bc:ID>
</bc:Personal>
<bc:Address>
<bc:Address1>abc123</bc:Address1>
<bc:Address2>def345</bc:Address2>
<bc:Address3>uyt57</bc:Address3>
</bc:Address>
<bc:PhoneData>
<bc:Phone1>111111111</bc:Phone1>
</bc:PhoneData>
</bc:Person>
</bc:PersonData>
预期的输出 XML - 没有子节点和命名空间
<?xml version="1.0" encoding="ISO-8859-1"?>
<PersonData>
<Person>
<FirstName>abc</FirstName>
<LastName>cde</LastName>
<ID>12345</ID>
<Address1>abc123</Address1>
<Address2>def345</Address2>
<Address3>uyt57</Address3>
<Phone1>111111111</Phone1>
</Person>
</PersonData>
解决方案
将两个xsl:copy
s 替换为关联元素的非命名空间版本,并替换xs:copy-of
为,xs:apply-templates
以便您xs:template/match="*"
可以按设计剥离命名空间。
然后这个 XSLT,
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:bc="urn:com.matrix/bc"
exclude-result-prefixes="bc">
<xsl:output method="xml" 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="@*">
<xsl:attribute name="{local-name(.)}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="bc:PersonData">
<PersonData>
<xsl:apply-templates select="bc:Person"/>
</PersonData>
</xsl:template>
<xsl:template match="bc:Person">
<Person>
<xsl:apply-templates select="*/*"/>
</Person>
</xsl:template>
</xsl:stylesheet>
将生成此输出 XML,
<?xml version="1.0" encoding="UTF-8"?>
<PersonData>
<Person>
<FirstName>abc</FirstName>
<LastName>cde</LastName>
<ID>12345</ID>
<Address1>abc123</Address1>
<Address2>def345</Address2>
<Address3>uyt57</Address3>
<Phone1>111111111</Phone1>
</Person>
</PersonData>
按照要求。
推荐阅读
- sed - 如何防止 sed 在文件末尾插入空行?
- haskell - 如何否定用户定义的整数?
- php - 在自定义帖子类型中显示类别中的随机帖子
- python - 从烧瓶项目的父目录导入.py文件
- elixir - 处理phoenix中已经存在的表之间的多对多关系
- javascript - babel-plugin-root-import 与 babel 7
- java - 组合与继承——这对单元测试有何帮助?
- javascript - 使用没有 SVG 的 SVG 路径
- linux - linux中“shutdown”、“ftp”用户的目的?
- android - NoSuchMethodError:没有静态方法 combineMeasuredStates 与底部导航视图