2011-10-03 43 views
1

我使用XSLT 1.0 XML路徑和具有下面的示例代碼:如何獲得在XSLT XML節點值,如果我們必須在參數

在我的XSLT,我有其中有我的XML路徑設置了一個param

<xsl:param name="sitespath"/> 

我知道可以加載它作爲文件,然後相應地進一步獲取值,像下面

<xsl:variable name="siteInfoPath" select="document($sitespath)/sitedata/region/site/language"/> 

上面siteInfoPath XSLT varaible是升oading文檔與/sitedata /區域/網站/語言數據,但是現在我想利用PublishDate,下面是XML樣本格式

<?xml version="1.0"?> 
<sitedata> 
<resources> 
<WorldwideSites>Worldwide sites</WorldwideSites> 
<PublishedDate>10/3/2011 9:12:35 AM</PublishedDate> 
</resources> 
<region code="global" title="Global"> 
<site defaultLanguage="en" id="tcm:0-233-1" url="/english" countryCode="" title="" order="1"> 
<language code="en" pubId="tcm:0-233-1" pubPath="\english" Culture="en-GB" ShortDate="dd MMM yy" ShortDateShortDay="ddd dd MMM yy" ShortDateTime="dd MMM yy, HH:mm" LongDate="d MMMM, yyyy" LongDateTime="d MMMM, yyyy, HH:mm" LongDateExtendedShortDay="ddd dd MMM, yyyy" LongDateExtended="dddd, d MMMM, yyyy" LongDateExtendedTime="dddd, d MMMM, yyyy, HH:mm" MonthYear="MMMM, yyyy" OmniturePrefix="ek global:en:" OmnitureReportSuite="emirnewglobalenglish,emirnewibems" OmnitureDevReportSuite="emirglobalendev" sifr="Y" localTitle="" url="/english" mobileRedirect="true" flightStatusAlert="true" GoLiveDate="20071110" targetHost="http://fly1.com" hpSearchF="Yes" hpHotelsCars="Yes" hpMYB="Yes" hpOLCI="Yes" hpFStatus="Yes" hpServicesF="Yes">English</language> 
</site> 

我需要使用另一個變量,需要加載像這樣的文檔

<xsl:variable name="siteInfoDate" select="document($sitespath)/sitedata/resources/PublishedDate"/> 

我不想再次加載相同的XML ...請建議!!

回答

2

動態Xpath評估通常需要使用擴展函數 - 兩者都在XSLT 1.0和XSLT 2.0中。這不是一個好主意,因爲你可能會或可能找不到這樣的擴展,最終可能需要編寫自己的擴展。此外,代碼的可移植性已被破壞。

我需要使用另一個變量,需要加載文件這樣

<xsl:variable name="siteInfoDate" select="document($sitespath)/sitedata/resources/PublishedDate"/> 

我不希望加載相同的XML再次......請建議!

這實際上是解決問題的最好辦法。

這是發行超過一個調用具有相同的URL負載document()功能和解析相同的文檔超過一次普遍的誤解。

W3C XSLT specification defines that the URL typically is loaded and parsed only once -- the function is stable,無論document()函數調用多少次。

因此,沒有任何效率損失。

爲了消除你的恐懼,不要(這將幫助你睡不好覺,但並不是在所有需要):

<xsl:variable name="vDoc" select="document($sitespath)"/> 

<xsl:variable name="siteInfoDate" 
       select="$vDoc/sitedata/resources/PublishedDate"/> 

<xsl:variable name="siteInfoPath" 
    select="$vDoc/sitedata/region/site/language"/> 

在這裏你只使用一個單一調用document()獲取文檔功能。

+0

謝謝迪米特清除所有這些概念! –

+0

@Manu:不客氣。 –

0

一般在XSL 1,你將不得不使用擴展功能,這是沒有做到這一點直接的方式。這一定程度上取決於你使用的是實際的解析器,但是這裏是與Xalan工作,支持可選的EXSLT functions一個例子:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:dyn="http://exslt.org/dynamic"> 
    <xsl:param name="sitespath">/sitedata/region/site/language</xsl:param> 

    <xsl:template match="/"> 
     <xsl:message> 
      <xsl:value-of select="dyn:evaluate($sitespath)/@code"/> 
     </xsl:message> 
    </xsl:template> 
</xsl:stylesheet> 

evaluate()功能將動態評估XPath字符串和上面的例子會簡單地打印出來在sitespath的任何XPath值下計算出的屬性code的值。

如果您不使用Xalan,那麼您需要做的事情可能會有所不同。例如,對於撒克遜解析器,您只需將名稱空間dyn URI更改爲http://saxon.sf.net/即可獲得更新版本,對於較舊版本則可更改爲http://icl.com/saxon

相關問題