【发布时间】:2011-07-16 00:35:28
【问题描述】:
我有大量的 XML 文件需要使用 XSLT 进行转换。问题是这些文件中有许多是由不同的人手写的,并且它们没有使用一致的名称来引用模式。例如,一个文件可能使用:
xmlns:itemType="http://example.com/ItemType/XSD"
其他人可能会使用前缀“it”而不是“itemType”:
xmlns:it="http://example.com/ItemType/XSD"
如果这还不够糟糕,还有几个文件使用两个或三个同义词来表示同一件事!
(显然有很多剪切和粘贴操作)
现在,因为 XSLT 文件中的模式匹配似乎适用于名称空间前缀(与其相关的模式相反),所以该模式仅匹配其中一个变体。所以如果我写这样的东西:
... 模板>然后它只匹配我想要它的案例的一个子集。
问题 1: 有没有办法让 XSLT 匹配所有变体?
问题 2: 有没有办法删除重复项,以便所有输出文件使用一致的命名?
我天真地尝试使用“命名空间别名”,但我想我误解了它的作用,因为我根本无法让它做任何事情 - 要么匹配所有变体,要么影响输出 XML。
【问题讨论】:
-
您使用的是哪种 XSLT 处理器? XSLT 应该使用 URI 进行匹配,而不是文本前缀。
-
xsltproc --version 使用 libxml 20626、libxslt 10117 和 libexslt 813 xsltproc 是针对 libxml 20626、libxslt 10117 和 libexslt 813 编译的 libxslt 10117 是针对 libxml 20626 编译的 libexslt 813 是针对 libxml 20626 编译的显然,构建,但我相信我们也有一个行为相同的 windows 目标。
-
嗯,这确实很令人困惑。看起来它有时确实匹配变体,但有时不匹配。我将尝试找出导致不同行为的原因。如果它确实使用 URI 而不是前缀,那么这将消除第一个问题。在哪种情况下,您知道后续问题的任何答案吗?
-
好的,我更新了问题以反映一个绝对不匹配的实例。可能是因为在那个例子中“itemType”的用法有点复杂。
-
查看我的答案以获得解释和 XSLT 1.0 解决方案。
标签: xslt namespaces duplicates alias