2012-05-22 65 views
4

我有xml文件,它們在Web瀏覽器中查看時使用XSL樣式表進行格式化。我將xml文件保存在一箇中央位置,這是我的同事可以訪問的共享驅動器。如果他們直接從共享位置打開XML文件,則它會正確呈現,但有時它們會獲取XML的副本,並且只會獲取它們所需的XML文件。當他們在瀏覽器中查看文件時,它無法找到XSL樣式表,因此無法呈現。有沒有辦法說xsl樣式表是否可用,是否可以使用它,如果沒有,那麼只需忽略使用樣式表並顯示xml文件就好像沒有樣式表一樣。基本上這意味着當採取本地拷貝時不會出現錯誤。可以這樣做可選使用xsl樣式表

回答

-1

我懷疑沒有完整的方法來做到這一點。您可以使用使用,當進口屬性是這樣的...

<xsl:import 
    xmlns:fn="http://www.w3.org/2005/xpath-functions" 
    href="'general.xslt'" 
    use-when="fn:unparsed-text-available('general.xslt') /> 

上述元素將導入樣式表「general.xslt」如果它存在。此解決方案的問題/侷限性在於,對於@href屬性,XSLT知道從xslt的配置(OASIS目錄,命令行參數,環境變量 - 無論它是供應商特定的)哪裏可以找到general.xslt。然而,相同的位置查找邏輯不適用於採用URI參數的unparsed-text-available()。

所以,你可能想參數化這樣的上述元素...

<xsl:import 
    xmlns:fn="http://www.w3.org/2005/xpath-functions" 
    href="$stylesheet-to-import" 
    use-when="fn:unparsed-text-available($uri-of-stylesheet-to-import) /> 

假定其中以下條件:

  1. $樣式表對導入的參數/變量要導入的樣式表。如果可以通過XSLT引擎定位,它可以是簡寫形式,否則它應該與$ uri-of-stylesheet-to-import相同
  2. $ uri-stylesheet-to-import是樣式的URI如果存在,則導入表格。
  3. 如果$ uri-of-stylesheet-to-import指向的文件存在,那麼它是一個有效的xslt文件。

我認爲這個解決方案只適用於XSLT 2.0。我不確定XSLT 1.0。

另請參閱Dimitre對此類似問題的回答:How do I check for the existence of an external file with XSL?

注意: 作爲fn:unparsed-text-available()的替代方法,您也可以使用fn:doc-available()。它會檢查文檔是否爲有效的XML,速度會更慢,根據您的問題,這可能會也可能不會是一件好事。

+0

這是否意味着我可以在我的xml文件中使用xsl import語句作爲一行,這樣如果xml文件被移動,將會爲關聯(導入)的樣式表進行檢查?如果樣式表存在,它會很好地呈現,但如果沒有找到樣式表,它會顯示爲原始XML? –

+1

這不起作用。瀏覽器只支持XSLT 1.0,它沒有use-when。而href屬性必須是硬編碼的,無論是在1.0還是2.0。 Downvoting。 –

0

你大概是依靠<?xml-stylesheet?>處理指令。我不知道有什麼辦法來參數化這種行爲如果樣式表不能找到:我敢說這取決於瀏覽器。

爲什麼不能使用絕對URI來從網絡上的任何位置獲取樣式表?您可能會遇到跨站點腳本問題,但值得嘗試。