xslt - 在根元素上声明所有命名空间
问题描述
我想要一个转换,使得文档中的所有命名空间都在文档根元素上声明。以便
<a>
<ns1:b xmlns:ns1="urn:ns1"/>
<ns2:c xmlns:ns2="urn:ns2"/>
</a>
变成
<a xmlns:ns1="urn:ns1" xmlns:ns2="urn:ns2">
<ns1:b/>
<ns2:c/>
</a>
命名空间是否出现在本地声明中并不重要,关键是它们都应该具有全局范围。
解决方案
不确定为什么命名空间声明的放置会有所不同。不过,如果您愿意,您可以尝试以下方法:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/a">
<a xmlns:ns1="urn:ns1" xmlns:ns2="urn:ns2">
<xsl:apply-templates/>
</a>
</xsl:template>
</xsl:stylesheet>
或者以更通用的方式:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:copy-of select="//namespace::*"/>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这些可能会起作用,也可能不起作用,这取决于您的 XSLT 处理器的心血来潮。
推荐阅读
- ios - 由于发送到无法识别的选择器而崩溃(仅在首次启动后)
- php - Laravel 不自动加载类
- javascript - 如何在Javascript中将字符串转换为整数和运算符?
- python - Python:将矩阵重塑为特定形式的向量
- c - select() 或 epoll() 在链接原始接口上运行时不返回
- reactjs - jss 覆盖 material-ui 非确定性类
- python - 使用 matplotlib 在 Linux Ubuntu 的 Windows 子系统上创建直方图
- c - 使用阶乘函数和余弦函数通过 Maclaurin 级数逼近计算 cos(x)
- keras - Keras int_shape 在自定义损失函数中返回 None
- python-2.7 - RPi3 无法通过 Bluepy python 找到 ffe0 服务