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

时间:2013-02-13 09:40:50

标签: xslt namespaces

我有一个带有默认命名空间的输入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”中使用默认命名空间正常工作。当我读取没有任何命名空间的lookup 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或匹配任何命名空间而不包含namespce?

谢谢

2 个答案:

答案 0 :(得分:1)

  

我是否有任何方法可以在模板加工“查找”中指定忽略xpath-default-namespace或匹配任何命名空间而不包含namespce?

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

  

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

From the XSLT 2.0 spec

所以你可以说

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

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

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

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

答案 1 :(得分:0)

我确实解决了问题但确定会有其他办法。我做的是我将查找和键xsl函数的模板匹配移动到另一个文档,在xsl stylesheed元素中我将xpath-default-namespace =“”。因此对于那些匹配xsl的xpath,使用default namespace as none。

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