ошибка при объявлении и использовании функции на xsl - PullRequest
2 голосов
/ 07 февраля 2011

просто пытается создать и использовать функцию XSL, которая отображает содержимое узла, если оно есть, или дефис, если он пуст.

Вот некоторые части файла:

<xsl:stylesheet version="2.0" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fn="http://www.w3.org/2005/xpath-functions"
  xmlns:qes="http://www.qwamci.com">

  <xsl:function name="qes:textOrDash" as="xs:string">
    <xsl:param name="mynode" />
    <xsl:sequence select="if (fn:compare(translate($mynode, ' ', ''), '')=0) then '-' else $mynode" />
  </xsl:function>

  <xsl:template match="Response">
    <xsl:value-of select="qes:textOrDash(./SOME/OTHER/XPATH/TO/NODE)" />
  </xsl:template>

</xsl:stylesheet>

Ошибка:

Erreur:java.lang.NoSuchMethodException: For extension function, could not find method org.apache.xml.utils.NodeVector.textOrDash([ExpressionContext,] ).

Есть идеи?

Ответы [ 3 ]

1 голос
/ 07 февраля 2011

Во-первых, я не думаю, что вам нужна функция для этого. Как пример, эта таблица стилей:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="test">
        <xsl:value-of select="(.,'-')[normalize-space(.)][1]"/>
    </xsl:template>
</xsl:stylesheet>

С этим входом:

<test>string</test>

Выход:

string

С этим входом:

<test></test>

Выход:

-

С этим входом:

<test><not-string-value/></test>

Выход:

-

И этот вход:

<test>&#x20;&#xA;&#x9;&#xD;</test>

Выход

-

О вашей функции: вы только чередуете пробел ...

1 голос
/ 07 февраля 2011

Вам необходимо определить некоторые параметры для вашей функции. Вы определили функцию qes:textOrDash(), вам нужно добавить <xsl:param name="input"/> к определению функции, а затем сослаться на $input вместо ., чтобы вы получили:

<xsl:function name="qes:textOrDash" as="xs:string">
  <xsl:param name="input" />
  <xsl:sequence select="if (fn:compare(translate($input, ' ', ''), '')=0) then '-' else ." />
</xsl:function>
0 голосов
/ 07 февраля 2011

Похоже, вы пытаетесь выполнить преобразование XSLT 2.0 с использованием процессора XSLT 1.0 .

В XSLT 1.0 нет инструкции <xsl:function>, но можно использовать шаблоны:

<xsl:call-template name="textOrDash">
 <xsl:with-param name="mynode" select="SomeXPath-Expression"/>
</xsl:call-template>

и

<xsl:template name="textOrDash">
 <xsl:param name="mynode" select="someDefault"/>

<!-- Processing here -->
</xsl:template>
...