Xslt 带查找文件的XSL默认命名空间

Xslt 带查找文件的XSL默认命名空间,xslt,namespaces,Xslt,Namespaces,我有一个带有默认名称空间的输入xml。如下图所示 <?xml version="1.0" encoding="UTF-8"?> <root xmlns="aaa"> <subroot> <country>aaa</country> <country>bbb</country> <country>ccc</country> </subroot> </

我有一个带有默认名称空间的输入xml。如下图所示

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

aaa
bbb
ccc
转换时,我使用xpath default namespace=“aaa”,因为否则xpath将不匹配。同样,我必须使用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默认名称空间或匹配任何不包含名称的名称空间


谢谢

我确实解决了这个问题,但肯定还有其他办法。我所做的是将用于查找和键xsl函数的模板匹配移动到另一个文档中,并在xsl stylesheed元素中放置xpath default namespace=“”。因此,对于那些匹配xsl的xpath,请使用默认名称空间作为none

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

是否有任何方法可以在模板加工“查找”中指定,以忽略xpath默认名称空间或匹配任何不包含名称的名称空间

您可以在样式表中的任何位置指定
xpath默认名称空间
:xpath表达式将查找树并使用“最近的祖先”值

对于样式表中的任何元素,此属性都有一个有效值,即该元素或指定此属性的最内层包含元素上的
[xsl:]xpath默认命名空间的值

()

所以你可以说

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

这将创建一个
,其中
xxx
是当前上下文节点的
{bbb}foo
子元素的值。

我不知道xpath默认名称空间在任何地方都可用。根据我的实际情况,我有很多xsl关键函数。因此,我所做的是将所有关键函数移到一个文档中,并将xpath default namespace=“”放在样式表元素中。所以我不需要在所有的密钥中复制它。感谢您的快速回复lan:)@susithasenarath当然,总是有一种老式的替代方法,即忘记
xpath默认名称空间
,而是将URI映射到前缀并在xpath中使用,即put
xmlns:a=“aaa”<代码> XSL:样式表< /代码>,然后使用<代码> <代码>。是的,蓝,我也这么认为。但在我的情况下仍然不太好,因为我已经完成了xsl,它有数百个xpath表达式。因此,如果我必须在每一个前缀上加上前缀,那将是一场噩梦。xpath默认名称空间为我提供了一个解决此问题的简单方法。现在一切都好了
<something xsl:xpath-default-namespace="bbb" attr="{foo}" />