2013-02-13 89 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

相關問題