我有一个默认命名空间的输入xml。例如如下。带查找文件的XSL默认名称空间
<?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 key函数来读取查找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默认命名空间 “//国家” 工作正常。当我读取没有任何命名空间的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>
有没有我可以在模板MACHING“查找”指定忽略XPath的默认名称空间或匹配,包括没有任何namespce命名空间的任何方式?
谢谢
我不知道xpath-default-namespace在任何地方都可用。对于我的实际情况,我有许多xsl键功能。所以我所做的是将所有的关键函数移动到一个文档中,并将xpath-default-namespace =“”放入样式表元素中。所以我不需要在所有密钥中都复制它。 感谢您的快速回复lan :) – 2013-02-13 12:35:33
@susithasenarath当然总是有一种老式的方式来忘记'xpath-default-namespace',而是将URI映射为前缀并在XPath中使用它,即将'在xsl:stylesheet上使用xmlns:a =“aaa”',然后使用''。 –
2013-02-13 12:43:31
是的,我也考虑过。但是我的情况仍然不好看,因为我已经完成了xsl,它有数百个xpath表达式。所以如果我必须在每一个上加上前缀,那么这将是一场噩梦。 xpath-default-namespace给我一个简单的解决方法就是引入这个问题。现在每件事情都很好。 :) – 2013-02-14 03:55:53