2009-08-21 10 views
7

Mam funkcję XSLT, która sprawdza, czy wysłany parametr ma format YYYYMMDD, czy nie. W niektórych warunkach nie otrzymuję żadnej wartości do funkcji, w tych warunkach SAXON rzuca poniżej błędówObsługa pustych sekwencji w funkcji XSLT

„Pusta sekwencja nie jest dozwolony jako pierwszy argument CDA: isValidDate()”

Jakieś sugestie, jak sobie z tym poradzić?

Odpowiedz

12

W XSLT nie ma wartości Null. Aby przedstawić brakującą wartość, możesz użyć łańcucha o zerowej długości lub pustej sekwencji. Nie są tym samym - pusta sekwencja zwróci 0 z licznika ($ x), ale ciąg o zerowej długości jest ciągiem zawierającym jeden element typu xs: string, który ma długość ciągu 0 (count ($ x) = 1 i długość łańcucha ($ x) = 0).

Większość standardowych funkcji XPath akceptuje ciąg o zerowej długości lub pustą sekwencję, ale funkcja niestandardowa może nie być.

Problem może wystąpić, jeśli wybierasz kolejność znaków. Na przykład, jeśli wybierzesz wartość węzłów zawierających ciąg, którego węzeł nie istnieje, otrzymasz pustą sekwencję - ale jeśli węzeł istnieje, a wartość jest pusta, otrzymasz pusty ciąg znaków.

Zmodyfikuj sposób wybierania wartości, aby zawsze mieć pusty ciąg (lub zawiń/zmień funkcję isValidDate, aby zaakceptować sekwencję pustą). Następująca funkcja definiuje pustą sekwencję i przekształca ją w ciąg o zerowej długości:

<xsl:function name="cda:isValidDate" as="xs:boolean"> 
    <xsl:param name="datestring" as="xs:string?"/> 
    <xsl:variable name="reallyastring" select="string($datestring)"/> 
    Your code 
</xsl:function> 

? na xs: string? Parametr "typ" pozwala na dostarczenie jednego lub żadnych elementów. Funkcja string (...) nigdy nie zwraca pustego łańcucha, więc konwertuje pustą sekwencję na ciąg o zerowej długości.

+1

Lub użyj 'xs: choose', aby sprawdzić, czy sekwencja jest pusta (' count() = 0') przed wywołaniem funkcji na niej. –

+0

jak mogę zadeklarować moją funkcję, aby zaakceptować pustą sekwencję? czy istnieje jakiś typ danych? –

+0

Zaktualizuj odpowiedź, aby pokazać, jak zaakceptować pustą sekwencję i przekonwertować ją na ciąg o zerowej długości. –