2013-04-11 5 views
1

Невозможно использовать xsl: переменные в выражениях xpath? Я уверен, что моя переменная имеет правильное значение. Попробовал это как строку, так и число. Первый один работает, но второй один выбирает все содержимое узла, а не только один с индексом 4.Переменные в выражениях xpath

<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 строк выше делать. –

ответ

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 вместо этого, с if конструкцией в XPath 2.0:

<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

+0

Использование 'xsl: sequence' вместо' xsl: value-of' внутри 'xsl: variable' не изменяет тип' xsl: variable', если оно настроено как ' .. 'с непустым содержимым - это временное дерево (см. http://www.w3.org/TR/xslt20/#temporary-trees), поэтому вам нужно используйте 'as =" xs: integer "' или вам нужно использовать атрибут 'select' с выражением XPath, возвращающим' xs: integer', чтобы использовать эту переменную в позиционном предикате. –

+0

Спасибо @MartinHonnen, я отредактировал ответ в свете вашего комментария. –

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> 

работает ниже под XML

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

получить выход

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

@ user874774: Не зная полного кода, мы не смогли исправить вашу проблему. Если вы хотите использовать это как ссылку. – siva2012

+0

please se my edit – pethel

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

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 
Смежные вопросы