2013-04-11 74 views
1

在xpath表達式中使用xsl:變量不可行嗎?我相信我的變量具有正確的值。已經嘗試過它作爲字符串和數字。第一個工作,但第二個選擇所有內容節點,只是一個不帶指數4xpath表達式中的變量

<xsl:apply-templates select="data/contents[4]/content" > 
<xsl:apply-templates select="data/contents[$myVariable]/content" > 

編輯

<xsl:variable name="dayOfWeekIndex">  
     <xsl:choose>  
      <xsl:when test="lower-case($dayOfWeek) = 'monday'"> 
       <xsl:value-of select="number(1)" /> 
      </xsl:when> 
      <xsl:when test="lower-case($dayOfWeek) = 'tuesday'"> 
       <xsl:value-of select="number(2)" /> 
      </xsl:when> 
      <xsl:when test="lower-case($dayOfWeek) = 'wednesday'"> 
       <xsl:value-of select="number(3)" /> 
      </xsl:when> 
      <xsl:when test="lower-case($dayOfWeek) = 'thursday'"> 
       <xsl:value-of select="number(4)" /> 
      </xsl:when> 
      <xsl:when test="lower-case($dayOfWeek) = 'friday'"> 
       <xsl:value-of select="number(5)" /> 
      </xsl:when> 
      <xsl:when test="lower-case($dayOfWeek) = 'saturday'"> 
       <xsl:value-of select="number(6)" /> 
      </xsl:when> 
      <xsl:when test="lower-case($dayOfWeek) = 'sunday'"> 
       <xsl:value-of select="number(7)" /> 
      </xsl:when> 
     </xsl:choose> 
    </xsl:variable> 
+0

你可能會有興趣看的XPath *的一行*是做什麼上面的25行做。 – 2013-04-12 03:17:10

回答

1
<xsl:variable name="dayOfWeekIndex">  
    <xsl:choose>  
     <xsl:when test="lower-case($dayOfWeek) = 'monday'"> 
      <xsl:value-of select="number(1)" /> 
     </xsl:when> 
     .... 

與內容的<xsl:variable>但沒有as屬性將所述變量設置爲「臨時樹」,而不是一個號碼,因此謂詞[$dayOfweekIndex]被視爲一個布爾謂詞而不是在節點position()的限制。您需要將as="xs:integer"添加到xsl:variable標籤以強制該變量具有正確的類型。

或者,使用select代替,在XPath 2.0中的if構建體:

<xsl:variable name="dayOfWeekIndex" as="xs:integer" select=" 
    if (lower-case($dayOfWeek) = 'monday') then 1 else 
    if (lower-case($dayOfWeek) = 'tuesday') then 2 else 
    ..... 
    if (lower-case($dayOfWeek) = 'sunday') then 7 else 
    0" /> 
+0

謝謝。這使得我的方式。 – pethel 2013-04-11 10:15:31

+0

只要將xsl:variable'設置爲','xsl:variable'內使用'xsl:sequence'而不是'xsl:value-of'就不會改變'xsl:variable'的類型=「dayOfWeekIndex」> ..'非空內容它是一個臨時樹(見http://www.w3.org/TR/xslt20/#temporary-trees),所以你需要使用'as =「xs:integer」'或者你需要使用'select'屬性和一個XPath表達式來返回'xs:integer'以便能夠在位置謂詞中使用該變量。 – 2013-04-11 10:16:19

+0

感謝@MartinHonnen,我根據您的評論編輯了答案。 – 2013-04-11 11:15:17

0

當這種轉變

<?xml version='1.0'?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml"/> 
<xsl:variable name="para1" select="chapter/para"/> 
<xsl:template match="chapter"> 
    <p><xsl:apply-templates select="$para1"/></p> 
</xsl:template> 

</xsl:stylesheet> 

運行on XML

<?xml version="1.0"?> 
<chapter> 
<para>This is para</para> 
</chapter> 

得到輸出

<?xml version='1.0' ?> 
<p>This is para</p> 
+0

@ user874774:不知道您的完整代碼,我們無法糾正您的問題。如果你想用這個作爲參考。 – siva2012 2013-04-11 09:02:04

+0

請在我的編輯 – pethel 2013-04-11 10:01:45

2

它很重要,你如何設置變量或參數例如明顯與

<xsl:variable name="index" select="4"/> 
<xsl:apply-templates select="data/contents[$index]/content"/> 

它應該工作(即處理第四contents)中,用

<xsl:variable name="index">4</xsl:variable> 
<xsl:apply-templates select="data/contents[$index]/content"/> 

它不作爲謂詞表達式工作是xs:integer類型的不是,它是節點的非空序列。

+0

請參閱我的編輯如何設置我的變量。 – pethel 2013-04-11 09:40:20

1

正如其他人注意到,指定一個變量的類型真正重要的XSLT 2.0。

除此之外,這種轉變顯示瞭如何使用XPath單行以產生想要的結果

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:output method="text"/> 

<xsl:variable name="vWeekDays" as="xs:string+" select= 
"('monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday')"/> 


<xsl:template match="/"> 
    <xsl:variable name="vdayOfWeek" select="'Friday'"/> 

    <xsl:sequence select="index-of($vWeekDays, lower-case($vdayOfWeek))"/> 
</xsl:template> 
</xsl:stylesheet> 

當該變換被應用到任何XML文檔(未使用) ,在想,正確的結果產生

5