ссылка на переменную или параметр DataType должна соответствовать списку узлов - PullRequest
1 голос
/ 17 ноября 2011

У меня было следующее определение для переменной

<xsl:variable name="DataType" select="@DataType"/>

Который работает просто отлично ...

Теперь я хочу установить его значение, используя условие, подобное этому

<xsl:variable name="DataTypeOverrideType" select="$DataSource/@DataTypeOverrideType"/>
<xsl:variable name="DataType">
    <xsl:choose>
        <xsl:when test="$ObeyTypeOverride and $DataTypeOverride = 1">
            <xsl:value-of select="$DataTypeOverrideType"/>  
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="@DataType"/>      
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

Но я получаю следующую ошибку:

ссылка на переменную или параметр 'DataType' должна соответствовать списку узлов

Я также попробовал самый простой пример, подобный этому

<xsl:variable name="DataType">
    <xsl:value-of select="@DataType"/>      
</xsl:variable>

но я продолжаю получать сообщение об ошибке: |

После изменений, которые я внес в способ определения переменной, я пытаюсь ее использовать, например,

<xsl:when test="$DataType = 'ReachEdit'">

и вот так

<xsl:when test="$DataType = 9">

есть идеи, как решить эту проблему?

Спасибо, вперед!

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

Это связано с тем, что вы определяете переменную типа RTF (Result-Tree-Fragment) . Чтобы использовать содержимое этой переменной в качестве обычного дерева, сначала необходимо преобразовать его в обычное дерево, используя функцию расширения xxx:node-set(), где префикс "xxx:" должен быть связан с пространством имен реализации (предоставленным поставщиком).

Кроме того, предоставленный фрагмент кода не имеет смысла :

<xsl:variable name="DataType"> 
    <xsl:choose> 
        <xsl:when test="$ObeyTypeOverride and $DataTypeOverride = 1"> 
            <xsl:value-of select="@DataType"/>   
        </xsl:when> 
        <xsl:otherwise> 
            <xsl:value-of select="@DataType"/>       
        </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

В обоих случаях выдается одно и то же значение!

Я думаю, вы хотите что-то вроде этого :

<xsl:variable name="DataType"> 
    <xsl:choose> 
        <xsl:when test="$ObeyTypeOverride and $DataTypeOverride = 1"> 
            <xsl:value-of select="@DataType1"/>   
        </xsl:when> 
        <xsl:otherwise> 
            <xsl:value-of select="@DataType2"/>       
        </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

В таком случае в XPath 1.0 можно определить переменную без создания RTF :

<xsl:variable name="DataType" select=
  "@DataType1[$ObeyTypeOverride and $DataTypeOverride = 1]
  |
   @DataType2[not($ObeyTypeOverride and $DataTypeOverride = 1)]
" /> 

Обновление : теперь вопрос обновляется исправленным фрагментом и примером фактического использования переменной, которая вызывает сообщение об ошибке.

Поскольку переменная используется в качестве атомарного значения, сообщение об ошибке не должно появляться, если используются следующие выражения XPath:

string($DataType) = 'ReachEdit'

и

number($DataType) = 9
1 голос
/ 17 ноября 2011

Что ж, я не думаю, что вы получаете сообщение об ошибке «ссылка на переменную или параметр ... должны оцениваться в списке узлов» для фрагмента кода, который вы разместили, так как вы можете установить переменную так, как это возможно. Однако тогда переменная является фрагментом результирующего дерева с единственным текстовым дочерним узлом, а не набором узлов. Поэтому я подозреваю, что позже вы попробуете что-то вроде <xsl:apply-templates select="$DataType"/> или <xsl:for-each select="$DataType">...</xsl:for-each>, и тогда вы получите ошибку.

Трудно предложить решение в качестве вашего фрагмента

<xsl:variable name="DataType">
    <xsl:choose>
        <xsl:when test="$ObeyTypeOverride and $DataTypeOverride = 1">
            <xsl:value-of select="@DataType"/>  
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="@DataType"/>      
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

логически не имеет для меня большого смысла, как when, так и otherwise do value-of select="@DataType", поэтому мне интересно, чего вы на самом деле хотите достичь, кроме непосредственного выполнения <xsl:variable name="DataType" select="@DataType"/>.

Так что вам нужно будет более подробно объяснить, чего вы хотите достичь, тогда мы можем предложить XSLT способ решения этой проблемы.

[править] возможно <xsl:variable name="DataType" select="($DataSource/@DataTypeOverrideType[$ObeyTypeOverride and . = 1] | @DataType)[1]"/> достаточно.

...