0

我有一个带有默认命名空间的输入 xml。例如如下。

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="aaa">
<subroot>
    <country>aaa</country>
    <country>bbb</country>
    <country>ccc</country>
</subroot>
</root>

转换时我使用 xpath-default-namespace="aaa" 因为否则 xpaths 将不匹配。同样,我必须使用 xsl 键功能读取查找 xml。例如如下

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xpath-default-namespace="aaa" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:variable name="LookupDoc" select="document('lookup.xml')" />
<xsl:key name="ObjectType-lookup" match="lookup" use="@att1" />

<xsl:template match="//country">
    <countrynew>
        <xsl:apply-templates select="$LookupDoc/*">
            <xsl:with-param name="curr-code" select="string(.)" />
        </xsl:apply-templates>
    </countrynew>
</xsl:template>

<xsl:template match='lookups'>
    <xsl:param name="curr-code" />
    <xsl:value-of select="key( 'ObjectType-lookup' , normalize-space($curr-code))/@att2" />
</xsl:template>

在样式表元素 xpath "//country" 中使用默认命名空间可以正常工作。当我阅读没有任何命名空间的查找 xml 时出现问题。例如:

<?xml version="1.0" encoding="UTF-8"?>
<x:lookups>
     <lookup att1="aaa" att2="zzz"/>
     <lookup att1="bbb" att2="yyy"/>
     <lookup att1="ccc" att2="xxx"/>
</x:lookups>

有什么方法可以在模板加工“查找”中指定以忽略 xpath-default-namespace 或匹配任何命名空间,包括没有命名空间?

谢谢

4

2 回答 2

1

有什么方法可以在模板加工“查找”中指定以忽略 xpath-default-namespace 或匹配任何命名空间,包括没有命名空间?

您可以xpath-default-namespace在样式表中的任何位置指定:XPath 表达式将查找树并使用“最近的祖先”值。

对于样式表中的任何元素,此属性都有一个有效值,即[xsl:]xpath-default-namespace该元素或指定此类属性的最内层包含元素的值

来自 XSLT 2.0 规范

所以你可以说

<xsl:template match='lookups' xpath-default-namespace=''>

覆盖xsl:stylesheet元素上指定的默认命名空间。您甚至可以在样式表中的文字结果元素上指定它,如下所示xsl:xpath-default-namespace

<something xsl:xpath-default-namespace="bbb" attr="{foo}" />

这将创建一个<something attr="xxx" />wherexxx{bbb}foo当前上下文节点的子元素的值。

于 2013-02-13T11:54:59.140 回答
0

我确实解决了问题,但肯定会有其他方法。我所做的是将查找和关键 xsl 函数的模板匹配移动到不同的文档,并在 xsl stylesheed 元素中放置 xpath-default-namespace=""。因此,对于那些与 xsl 匹配的 xpath,使用默认命名空间作为无。

我仍然很好奇天气有一种方法可以在模板本身中指定在匹配时不使用命名空间。

于 2013-02-13T11:14:14.087 回答