2012-06-01 62 views
1

我正在使用call-template,其源代碼如下所示。在xslt中處理呼叫模板的不同名稱空間

來源:

<Content> 
     <first> 
       <text> 
       Text 
      </text> 
      <link xmlns="Some namespace"> 
       <AA>abcd</AA> 
       <BB>hi all</BB> 
      </link> 
     </first> 

     <second> 
     <link xmlns="Some other namespace"> 
       <AA>abcd1</AA> 
       <BB>hi all21</BB> 
      </link> 
     </second> 

      <three> 
     <link xmlns="other namespace"> 
       <AA>abcd2</AA> 
       <BB>hi all33</BB> 
      </link> 
     </three> 
    </Content> 

XSLT寫:

  <?xml version="1.0" encoding="utf-8"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:n1="Some namespace" xmlns:n2="Some other namespace" xmlns:n3="other namespace"> 
     <xsl:output method="xml" indent="yes"/> 

     <xsl:template match="Content"> 
     <xsl:call-template name="process"> 
     <xsl:with-param name="item" select="first/n1:link" /> 
    </xsl:call-template> 
     <xsl:call-template name="process"> 
     <xsl:with-param name="item" select="second/n2:link" /> 
    </xsl:call-template> 
     <xsl:call-template name="process"> 
     <xsl:with-param name="item" select="three/n3:link" /> 
    </xsl:call-template> 


     </xsl:template> 

     <xsl:template name="process"> 
     <xsl:param name="item" /> 
     <xsl:value-of select="$item/AA" /> 
     </xsl:template> 

    </xsl:stylesheet> 

我越來越空白output.I知道原因,因爲我沒有追加的命名空間前綴它。像「n1:A」一樣。

隨着多次來臨。我寫了一個模板,並在需要時調用。但每個鏈接的名稱空間是不同的。如何修改我的代碼以便我可以重新使用模板「process」。

任何人都可以幫忙,我該如何修改相應的「進程」模板來處理不同的命名空間,但結構相同。

謝謝。

+0

'namespace ='屬性不會引入XML名稱空間。它只是一個屬性,所以在你的XSL中尋找它('select =')作爲命名空間是行不通的。至於答案,這將不得不等待,直到你的XML被糾正。 –

+0

@Jim Garrison。對不起,輸入錯誤。我編輯了這個問題。 – Patan

回答

0

而不是做這個

<xsl:value-of select="$item/AA" /> 

的你可以表達改變這種

<xsl:value-of select="$item/*[local-name() = 'AA'][namespace-uri()=namespace-uri($item)]" /> 

即檢查該名稱沒有命名空間爲「AA」,而且它具有相同的命名空間中的父元件。這就意味着如果你在'link'元素中有另一個'AA'元素,並且有一個不同的名字空間,它將不會被拾取。

+0

謝謝你的回答。 – Patan

0

值得指出的是,這是一個設計不佳的XML文檔。只要你看到有人創建了兩個命名空間N1和N2,使得N1中的本地名稱與N2中的本地名稱相同,就應該檢測到設計異味。他們讓XML處理起來更加困難。

當我看到這種類型的輸入(它有時會出現,如果人們錯誤地更改了他們詞彙表的版本2的名稱空間URI),我通常認爲處理它的最好方法是編寫一個管道,其中第一階段是來規範化命名空間,以便「真實」的處理邏輯不必像你的代碼一樣處理多個命名空間,這總是看起來像意大利麪。

相關問題