XSLT:如何删除同义 namespace

标签 xslt namespaces duplicates alias

我有大量的 XML 文件,需要使用 XSLT 进行转换。问题是这些文件中有许多是由不同的人手写的,并且他们没有使用一致的名称来引用模式。例如,一个文件可能使用:
xmlns:itemType="http://example.com/ItemType/XSD"
另一个可能使用前缀“it”而不是“itemType”:
xmlns:it="http://example.com/ItemType/XSD"
如果这还不够糟糕,那么有几个文件对同一事物使用了两个或三个同义词!


<文档
xmlns:it="http://example.com/ItemType/XSD"
xmlns:itemType="http://example.com/ItemType/XSD"
xmlns:ItemType="http://example.com/ItemType/XSD"
...

(显然有很多剪切和粘贴正在进行)

现在,因为 XSLT 文件中的模式匹配似乎适用于 namespace 前缀(而不是它所涉及的模式),所以该模式只匹配其中一个变体。所以如果我写这样的东西:


...


然后它只匹配我想要的案例的一个子集。

问题 1:有什么方法可以让 XSLT 匹配所有变体?

问题 2:有没有办法删除重复项,以便所有输出文件都使用一致的命名?

我天真地尝试使用“命名空间别名”,但我想我误解了它的作用,因为我根本无法让它做任何事情 - 要么匹配所有变体,要么影响输出 XML。

版本=“1.0”
...
xmlns:it="http://example.com/ItemType/XSD"
xmlns:itemType="http://example.com/ItemType/XSD"
xmlns:ItemType="http://example.com/ItemType/XSD"
...



最佳答案

除非您明确说明,否则不会将属性值或文本节点转换为 QName。虽然这仅在 XSLT/XPath 2.0 中可行

在 XSLT/XPath 1.0 中,您必须“手动”执行此操作:

<xsl:template match="SomeNode">
    <xsl:variable name="vPrefix" select="substring-before(@xsi:type,':')"/>
    <xsl:variable name="vNCName" 
           select="translate(substring-after(@xsi:type,$vPrefix),':','')"/>
    <xsl:if test="namespace::*[
                     name()=$vPrefix
                  ] = 'http://example.com/ItemType/XSD'
                     and
                  $vNCName = 'SomeType'">
        <!-- Content Template -->
    <xsl:if>
</xsl:template>

编辑:全在一种模式(可读性较差,也许):
<xsl:template match="SomeNode[
                        namespace::*[
                           name()=substring-before(../@xsi:type,':')
                        ] = 'http://example.com/ItemType/XSD'
                           and
                        substring(
                          concat(':',@xsi:type),
                          string-length(@xsi:type) - 7
                        ) = ':SomeType'
                     ]">
    <!-- Content Template -->
</xsl:template>

关于XSLT:如何删除同义 namespace ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5316102/

相关文章:

xml - 在 XSL : How to avoid choose-blocks for wrapping elements? 中

html - 使用 Perl XML::XSLT 生成 OUTLOOK 有问题的 HTML

php - 使用 composer 和 PSR-0 自动加载命名空间

python - Python 中的模块、类和命名空间

python 返回列表中的重复项

javascript - XSL FO 文件中的 javascript 可以写入文档以使用 Apache FOP 进行处理吗?

xml - 在XSL中执行检查

excel - 使用 UNIQUE 返回不同列的值

c++ - 如何在命名空间中使用变量

检查重复条目不起作用