2013-02-13 87 views
0

我有一个默认命名空间的输入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命名空间的任何方式?

谢谢

回答

0

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

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

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子元素的值。

+0

我不知道xpath-default-namespace在任何地方都可用。对于我的实际情况,我有许多xsl键功能。所以我所做的是将所有的关键函数移动到一个文档中,并将xpath-default-namespace =“”放入样式表元素中。所以我不需要在所有密钥中都复制它。 感谢您的快速回复lan :) – 2013-02-13 12:35:33

+0

@susithasenarath当然总是有一种老式的方式来忘记'xpath-default-namespace',而是将URI映射为前缀并在XPath中使用它,即将'在xsl:stylesheet上使用xmlns:a =“aaa”',然后使用''。 – 2013-02-13 12:43:31

+0

是的,我也考虑过。但是我的情况仍然不好看,因为我已经完成了xsl,它有数百个xpath表达式。所以如果我必须在每一个上加上前缀,那么这将是一场噩梦。 xpath-default-namespace给我一个简单的解决方法就是引入这个问题。现在每件事情都很好。 :) – 2013-02-14 03:55:53

相关问题