XSLT проверяет и объединяет, если параметр недопустим

#xml #xslt

#xml #xslt

Вопрос:

У меня есть некоторые xsl:parameter s, которые мне нужно проверить, и в элементе detail я хочу объединить имена недопустимых параметров.

У меня есть проверки, которые проверяют параметры, но я не могу создать элемент detail. В этом элементе мне нужно поместить недопустимые параметры, разделенные символом ‘,’.

Для этого ввода: param1 = 123 и param2 = 50, элемент detail должен выглядеть следующим образом: <detail>param1, param2</detail>

Как я могу этого добиться?

Это код, который у меня есть на данный момент:

 <xsl:template name="validate">
    <invalidParams>
        <jsonArray>
            <xsl:if test="not(fn:matches($param1, '[0-9]{9}'))">
                <xsl:call-template name="invalidParam1" />
            </xsl:if>
            <xsl:if test="not(fn:matches($param2, '^(0?[1-9]|1[0-9]|2[0-9])


Комментарии:

1. Вы не можете ожидать, что кто-то поможет вам, если вы не предоставите ввод и вывод или, по крайней мере, подробное объяснение.

2. Я добавил более подробную информацию в свой пост.

Ответ №1:

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

 <xsl:variable name="params">
    <param name="param1" value="{$param1}" isValid="{matches($param1, '[0-9]{9}')}"/>
    <param name="param2" value="{$param2}" isValid="{matches($param2, '^(0?[1-9]|1[0-9]|2[0-9])

Затем вы можете заполнить  detail  элемент с помощью:

 <detail>
    <xsl:value-of select="$params/param[@isValid='false']/@name" separator=","/>
</detail>
 

и измените свои вызовы шаблонов, чтобы также использовать преимущества переменной.

Комментарии:

1. К сожалению, это ошибка, которую я получаю, когда определяю переменную invalidParams: Вызванную: java.lang. ClassCastException: класс org.apache.xpath.objects. XString не может быть приведен к классу org.apache.xpath.objects. XNodeSet Набор

2. @BocaBogdan, ваше сообщение об ошибке, похоже, исходит от Apache Xalan, который является процессором XSLT / XPath 1, непонятно, почему вы публикуете образцы, используя функцию, подобную matches той, которая была введена в XSLT / XPath 2, но попробуйте использовать процессор XSLT 1. В мире Java Saxon 9 или 10 можно использовать для выполнения XSLT / XPath 2 или с 2017 года даже 3.

3. @MartinHonnen, я использую WSO2 ESB с включенной поддержкой XPath 2.0 (Saxon Home Edition). Я не думаю, что это проблема.

4. @BocaBogdan, org.apache.xpath.objects. XString - это класс Xalan

5. @BocaBogdan Вы можете увидеть, как работает мое предложение (с использованием Saxon) здесь: xsltfiddle. liberty-development.net/6q1SDkK . Как говорит Мартин Хоннен, ошибка, которую вы получаете, исходит от Xalan. Код, который вы показываете в своем вопросе, возможно, не может работать в XSLT 1.0, поэтому вы должны были увидеть ошибку еще до попытки реализовать это.

Ответ №2:

Использование:

 <xsl:sequence select="
string-join(
 (
   'param1'[$param1[not(matches(., '[0-9]{9}'))]],
   'param2'[$param2[not(matches(., '^(0?[1-9]|1[0-9]|2[0-9])

============================

Полный пример кода:

 <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 
 <xsl:param name="param1" select="'123'"/>
 <xsl:param name="param2" select="'50'"/>

  <xsl:template match="/*">
    <detail>
     <xsl:sequence select="
        string-join(
         (
           'param1'[$param1[not(matches(., '[0-9]{9}'))]],
           'param2'[$param2[not(matches(., '^(0?[1-9]|1[0-9]|2[0-9])

Когда это преобразование применяется к любому XML-документу (не используется), получается требуемый правильный результат:

 <detail>param1, param2</detail>
 



))">
<xsl:call-template name="invalidParam2" />
</xsl:if>
</jsonArray>
</invalidParams>
<detail>
???
</detail>
</xsl:template>

Комментарии:

1. Вы не можете ожидать, что кто-то поможет вам, если вы не предоставите ввод и вывод или, по крайней мере, подробное объяснение.

2. Я добавил более подробную информацию в свой пост.

Ответ №1:

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


Затем вы можете заполнить detail элемент с помощью:


и измените свои вызовы шаблонов, чтобы также использовать преимущества переменной.

Комментарии:

1. К сожалению, это ошибка, которую я получаю, когда определяю переменную invalidParams: Вызванную: java.lang. ClassCastException: класс org.apache.xpath.objects. XString не может быть приведен к классу org.apache.xpath.objects. XNodeSet Набор

2. @BocaBogdan, ваше сообщение об ошибке, похоже, исходит от Apache Xalan, который является процессором XSLT / XPath 1, непонятно, почему вы публикуете образцы, используя функцию, подобную matches той, которая была введена в XSLT / XPath 2, но попробуйте использовать процессор XSLT 1. В мире Java Saxon 9 или 10 можно использовать для выполнения XSLT / XPath 2 или с 2017 года даже 3.

3. @MartinHonnen, я использую WSO2 ESB с включенной поддержкой XPath 2.0 (Saxon Home Edition). Я не думаю, что это проблема.

4. @BocaBogdan, org.apache.xpath.objects. XString - это класс Xalan

5. @BocaBogdan Вы можете увидеть, как работает мое предложение (с использованием Saxon) здесь: xsltfiddle. liberty-development.net/6q1SDkK . Как говорит Мартин Хоннен, ошибка, которую вы получаете, исходит от Xalan. Код, который вы показываете в своем вопросе, возможно, не может работать в XSLT 1.0, поэтому вы должны были увидеть ошибку еще до попытки реализовать это.

Ответ №2:

Использование:


============================

Полный пример кода:


Когда это преобразование применяется к любому XML-документу (не используется), получается требуемый правильный результат:


)}"/>
</xsl:variable>

Затем вы можете заполнить detail элемент с помощью:


и измените свои вызовы шаблонов, чтобы также использовать преимущества переменной.

Комментарии:

1. К сожалению, это ошибка, которую я получаю, когда определяю переменную invalidParams: Вызванную: java.lang. ClassCastException: класс org.apache.xpath.objects. XString не может быть приведен к классу org.apache.xpath.objects. XNodeSet Набор

2. @BocaBogdan, ваше сообщение об ошибке, похоже, исходит от Apache Xalan, который является процессором XSLT / XPath 1, непонятно, почему вы публикуете образцы, используя функцию, подобную matches той, которая была введена в XSLT / XPath 2, но попробуйте использовать процессор XSLT 1. В мире Java Saxon 9 или 10 можно использовать для выполнения XSLT / XPath 2 или с 2017 года даже 3.

3. @MartinHonnen, я использую WSO2 ESB с включенной поддержкой XPath 2.0 (Saxon Home Edition). Я не думаю, что это проблема.

4. @BocaBogdan, org.apache.xpath.objects. XString - это класс Xalan

5. @BocaBogdan Вы можете увидеть, как работает мое предложение (с использованием Saxon) здесь: xsltfiddle. liberty-development.net/6q1SDkK . Как говорит Мартин Хоннен, ошибка, которую вы получаете, исходит от Xalan. Код, который вы показываете в своем вопросе, возможно, не может работать в XSLT 1.0, поэтому вы должны были увидеть ошибку еще до попытки реализовать это.

Ответ №2:

Использование:


============================

Полный пример кода:


Когда это преобразование применяется к любому XML-документу (не используется), получается требуемый правильный результат:


))">
<xsl:call-template name="invalidParam2" />
</xsl:if>
</jsonArray>
</invalidParams>
<detail>
???
</detail>
</xsl:template>

Комментарии:

1. Вы не можете ожидать, что кто-то поможет вам, если вы не предоставите ввод и вывод или, по крайней мере, подробное объяснение.

2. Я добавил более подробную информацию в свой пост.

Ответ №1:

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


Затем вы можете заполнить detail элемент с помощью:


и измените свои вызовы шаблонов, чтобы также использовать преимущества переменной.

Комментарии:

1. К сожалению, это ошибка, которую я получаю, когда определяю переменную invalidParams: Вызванную: java.lang. ClassCastException: класс org.apache.xpath.objects. XString не может быть приведен к классу org.apache.xpath.objects. XNodeSet Набор

2. @BocaBogdan, ваше сообщение об ошибке, похоже, исходит от Apache Xalan, который является процессором XSLT / XPath 1, непонятно, почему вы публикуете образцы, используя функцию, подобную matches той, которая была введена в XSLT / XPath 2, но попробуйте использовать процессор XSLT 1. В мире Java Saxon 9 или 10 можно использовать для выполнения XSLT / XPath 2 или с 2017 года даже 3.

3. @MartinHonnen, я использую WSO2 ESB с включенной поддержкой XPath 2.0 (Saxon Home Edition). Я не думаю, что это проблема.

4. @BocaBogdan, org.apache.xpath.objects. XString - это класс Xalan

5. @BocaBogdan Вы можете увидеть, как работает мое предложение (с использованием Saxon) здесь: xsltfiddle. liberty-development.net/6q1SDkK . Как говорит Мартин Хоннен, ошибка, которую вы получаете, исходит от Xalan. Код, который вы показываете в своем вопросе, возможно, не может работать в XSLT 1.0, поэтому вы должны были увидеть ошибку еще до попытки реализовать это.

Ответ №2:

Использование:


============================

Полный пример кода:


Когда это преобразование применяется к любому XML-документу (не используется), получается требуемый правильный результат:


))]]
),
', ')"/>
============================

Полный пример кода:


Когда это преобразование применяется к любому XML-документу (не используется), получается требуемый правильный результат:


))»>
<xsl:call-template name=«invalidParam2» />
</xsl:if>
</jsonArray>
</invalidParams>
<detail>
???
</detail>
</xsl:template>

Комментарии:

1. Вы не можете ожидать, что кто-то поможет вам, если вы не предоставите ввод и вывод или, по крайней мере, подробное объяснение.

2. Я добавил более подробную информацию в свой пост.

Ответ №1:

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


Затем вы можете заполнить detail элемент с помощью:


и измените свои вызовы шаблонов, чтобы также использовать преимущества переменной.

Комментарии:

1. К сожалению, это ошибка, которую я получаю, когда определяю переменную invalidParams: Вызванную: java.lang. ClassCastException: класс org.apache.xpath.objects. XString не может быть приведен к классу org.apache.xpath.objects. XNodeSet Набор

2. @BocaBogdan, ваше сообщение об ошибке, похоже, исходит от Apache Xalan, который является процессором XSLT / XPath 1, непонятно, почему вы публикуете образцы, используя функцию, подобную matches той, которая была введена в XSLT / XPath 2, но попробуйте использовать процессор XSLT 1. В мире Java Saxon 9 или 10 можно использовать для выполнения XSLT / XPath 2 или с 2017 года даже 3.

3. @MartinHonnen, я использую WSO2 ESB с включенной поддержкой XPath 2.0 (Saxon Home Edition). Я не думаю, что это проблема.

4. @BocaBogdan, org.apache.xpath.objects. XString — это класс Xalan

5. @BocaBogdan Вы можете увидеть, как работает мое предложение (с использованием Saxon) здесь: xsltfiddle. liberty-development.net/6q1SDkK . Как говорит Мартин Хоннен, ошибка, которую вы получаете, исходит от Xalan. Код, который вы показываете в своем вопросе, возможно, не может работать в XSLT 1.0, поэтому вы должны были увидеть ошибку еще до попытки реализовать это.

Ответ №2:

Использование:


============================

Полный пример кода:


Когда это преобразование применяется к любому XML-документу (не используется), получается требуемый правильный результат:


)}»/>
</xsl:variable>

Затем вы можете заполнить detail элемент с помощью:


и измените свои вызовы шаблонов, чтобы также использовать преимущества переменной.

Комментарии:

1. К сожалению, это ошибка, которую я получаю, когда определяю переменную invalidParams: Вызванную: java.lang. ClassCastException: класс org.apache.xpath.objects. XString не может быть приведен к классу org.apache.xpath.objects. XNodeSet Набор

2. @BocaBogdan, ваше сообщение об ошибке, похоже, исходит от Apache Xalan, который является процессором XSLT / XPath 1, непонятно, почему вы публикуете образцы, используя функцию, подобную matches той, которая была введена в XSLT / XPath 2, но попробуйте использовать процессор XSLT 1. В мире Java Saxon 9 или 10 можно использовать для выполнения XSLT / XPath 2 или с 2017 года даже 3.

3. @MartinHonnen, я использую WSO2 ESB с включенной поддержкой XPath 2.0 (Saxon Home Edition). Я не думаю, что это проблема.

4. @BocaBogdan, org.apache.xpath.objects. XString — это класс Xalan

5. @BocaBogdan Вы можете увидеть, как работает мое предложение (с использованием Saxon) здесь: xsltfiddle. liberty-development.net/6q1SDkK . Как говорит Мартин Хоннен, ошибка, которую вы получаете, исходит от Xalan. Код, который вы показываете в своем вопросе, возможно, не может работать в XSLT 1.0, поэтому вы должны были увидеть ошибку еще до попытки реализовать это.

Ответ №2:

Использование:


============================

Полный пример кода:


Когда это преобразование применяется к любому XML-документу (не используется), получается требуемый правильный результат:


))»>
<xsl:call-template name=«invalidParam2» />
</xsl:if>
</jsonArray>
</invalidParams>
<detail>
???
</detail>
</xsl:template>

Комментарии:

1. Вы не можете ожидать, что кто-то поможет вам, если вы не предоставите ввод и вывод или, по крайней мере, подробное объяснение.

2. Я добавил более подробную информацию в свой пост.

Ответ №1:

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


Затем вы можете заполнить detail элемент с помощью:


и измените свои вызовы шаблонов, чтобы также использовать преимущества переменной.

Комментарии:

1. К сожалению, это ошибка, которую я получаю, когда определяю переменную invalidParams: Вызванную: java.lang. ClassCastException: класс org.apache.xpath.objects. XString не может быть приведен к классу org.apache.xpath.objects. XNodeSet Набор

2. @BocaBogdan, ваше сообщение об ошибке, похоже, исходит от Apache Xalan, который является процессором XSLT / XPath 1, непонятно, почему вы публикуете образцы, используя функцию, подобную matches той, которая была введена в XSLT / XPath 2, но попробуйте использовать процессор XSLT 1. В мире Java Saxon 9 или 10 можно использовать для выполнения XSLT / XPath 2 или с 2017 года даже 3.

3. @MartinHonnen, я использую WSO2 ESB с включенной поддержкой XPath 2.0 (Saxon Home Edition). Я не думаю, что это проблема.

4. @BocaBogdan, org.apache.xpath.objects. XString — это класс Xalan

5. @BocaBogdan Вы можете увидеть, как работает мое предложение (с использованием Saxon) здесь: xsltfiddle. liberty-development.net/6q1SDkK . Как говорит Мартин Хоннен, ошибка, которую вы получаете, исходит от Xalan. Код, который вы показываете в своем вопросе, возможно, не может работать в XSLT 1.0, поэтому вы должны были увидеть ошибку еще до попытки реализовать это.

Ответ №2:

Использование:


============================

Полный пример кода:


Когда это преобразование применяется к любому XML-документу (не используется), получается требуемый правильный результат:


))]]
),
‘, ‘)»/>
</detail>
</xsl:template>
</xsl:stylesheet>Когда это преобразование применяется к любому XML-документу (не используется), получается требуемый правильный результат:


))»>
<xsl:call-template name=«invalidParam2» />
</xsl:if>
</jsonArray>
</invalidParams>
<detail>
???
</detail>
</xsl:template>

Комментарии:

1. Вы не можете ожидать, что кто-то поможет вам, если вы не предоставите ввод и вывод или, по крайней мере, подробное объяснение.

2. Я добавил более подробную информацию в свой пост.

Ответ №1:

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


Затем вы можете заполнить detail элемент с помощью:


и измените свои вызовы шаблонов, чтобы также использовать преимущества переменной.

Комментарии:

1. К сожалению, это ошибка, которую я получаю, когда определяю переменную invalidParams: Вызванную: java.lang. ClassCastException: класс org.apache.xpath.objects. XString не может быть приведен к классу org.apache.xpath.objects. XNodeSet Набор

2. @BocaBogdan, ваше сообщение об ошибке, похоже, исходит от Apache Xalan, который является процессором XSLT / XPath 1, непонятно, почему вы публикуете образцы, используя функцию, подобную matches той, которая была введена в XSLT / XPath 2, но попробуйте использовать процессор XSLT 1. В мире Java Saxon 9 или 10 можно использовать для выполнения XSLT / XPath 2 или с 2017 года даже 3.

3. @MartinHonnen, я использую WSO2 ESB с включенной поддержкой XPath 2.0 (Saxon Home Edition). Я не думаю, что это проблема.

4. @BocaBogdan, org.apache.xpath.objects. XString — это класс Xalan

5. @BocaBogdan Вы можете увидеть, как работает мое предложение (с использованием Saxon) здесь: xsltfiddle. liberty-development.net/6q1SDkK . Как говорит Мартин Хоннен, ошибка, которую вы получаете, исходит от Xalan. Код, который вы показываете в своем вопросе, возможно, не может работать в XSLT 1.0, поэтому вы должны были увидеть ошибку еще до попытки реализовать это.

Ответ №2:

Использование:


============================

Полный пример кода:


Когда это преобразование применяется к любому XML-документу (не используется), получается требуемый правильный результат:


)}»/>
</xsl:variable>Затем вы можете заполнить detail элемент с помощью:


и измените свои вызовы шаблонов, чтобы также использовать преимущества переменной.

Комментарии:

1. К сожалению, это ошибка, которую я получаю, когда определяю переменную invalidParams: Вызванную: java.lang. ClassCastException: класс org.apache.xpath.objects. XString не может быть приведен к классу org.apache.xpath.objects. XNodeSet Набор

2. @BocaBogdan, ваше сообщение об ошибке, похоже, исходит от Apache Xalan, который является процессором XSLT / XPath 1, непонятно, почему вы публикуете образцы, используя функцию, подобную matches той, которая была введена в XSLT / XPath 2, но попробуйте использовать процессор XSLT 1. В мире Java Saxon 9 или 10 можно использовать для выполнения XSLT / XPath 2 или с 2017 года даже 3.

3. @MartinHonnen, я использую WSO2 ESB с включенной поддержкой XPath 2.0 (Saxon Home Edition). Я не думаю, что это проблема.

4. @BocaBogdan, org.apache.xpath.objects. XString — это класс Xalan

5. @BocaBogdan Вы можете увидеть, как работает мое предложение (с использованием Saxon) здесь: xsltfiddle. liberty-development.net/6q1SDkK . Как говорит Мартин Хоннен, ошибка, которую вы получаете, исходит от Xalan. Код, который вы показываете в своем вопросе, возможно, не может работать в XSLT 1.0, поэтому вы должны были увидеть ошибку еще до попытки реализовать это.

Ответ №2:

Использование:


============================

Полный пример кода:


Когда это преобразование применяется к любому XML-документу (не используется), получается требуемый правильный результат:


))»>
<xsl:call-template name=«invalidParam2» />
</xsl:if>
</jsonArray>
</invalidParams>
<detail>
???
</detail>
</xsl:template>

Комментарии:

1. Вы не можете ожидать, что кто-то поможет вам, если вы не предоставите ввод и вывод или, по крайней мере, подробное объяснение.

2. Я добавил более подробную информацию в свой пост.

Ответ №1:

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


Затем вы можете заполнить detail элемент с помощью:


и измените свои вызовы шаблонов, чтобы также использовать преимущества переменной.

Комментарии:

1. К сожалению, это ошибка, которую я получаю, когда определяю переменную invalidParams: Вызванную: java.lang. ClassCastException: класс org.apache.xpath.objects. XString не может быть приведен к классу org.apache.xpath.objects. XNodeSet Набор

2. @BocaBogdan, ваше сообщение об ошибке, похоже, исходит от Apache Xalan, который является процессором XSLT / XPath 1, непонятно, почему вы публикуете образцы, используя функцию, подобную matches той, которая была введена в XSLT / XPath 2, но попробуйте использовать процессор XSLT 1. В мире Java Saxon 9 или 10 можно использовать для выполнения XSLT / XPath 2 или с 2017 года даже 3.

3. @MartinHonnen, я использую WSO2 ESB с включенной поддержкой XPath 2.0 (Saxon Home Edition). Я не думаю, что это проблема.

4. @BocaBogdan, org.apache.xpath.objects. XString — это класс Xalan

5. @BocaBogdan Вы можете увидеть, как работает мое предложение (с использованием Saxon) здесь: xsltfiddle. liberty-development.net/6q1SDkK . Как говорит Мартин Хоннен, ошибка, которую вы получаете, исходит от Xalan. Код, который вы показываете в своем вопросе, возможно, не может работать в XSLT 1.0, поэтому вы должны были увидеть ошибку еще до попытки реализовать это.

Ответ №2:

Использование:


============================

Полный пример кода:


Когда это преобразование применяется к любому XML-документу (не используется), получается требуемый правильный результат:


))]]
),
‘, ‘)»/>

============================

Полный пример кода:


Когда это преобразование применяется к любому XML-документу (не используется), получается требуемый правильный результат:


))»>
<xsl:call-template name=«invalidParam2» />
</xsl:if>
</jsonArray>
</invalidParams>
<detail>
???
</detail>
</xsl:template>

Комментарии:

1. Вы не можете ожидать, что кто-то поможет вам, если вы не предоставите ввод и вывод или, по крайней мере, подробное объяснение.

2. Я добавил более подробную информацию в свой пост.

Ответ №1:

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


Затем вы можете заполнить detail элемент с помощью:


и измените свои вызовы шаблонов, чтобы также использовать преимущества переменной.

Комментарии:

1. К сожалению, это ошибка, которую я получаю, когда определяю переменную invalidParams: Вызванную: java.lang. ClassCastException: класс org.apache.xpath.objects. XString не может быть приведен к классу org.apache.xpath.objects. XNodeSet Набор

2. @BocaBogdan, ваше сообщение об ошибке, похоже, исходит от Apache Xalan, который является процессором XSLT / XPath 1, непонятно, почему вы публикуете образцы, используя функцию, подобную matches той, которая была введена в XSLT / XPath 2, но попробуйте использовать процессор XSLT 1. В мире Java Saxon 9 или 10 можно использовать для выполнения XSLT / XPath 2 или с 2017 года даже 3.

3. @MartinHonnen, я использую WSO2 ESB с включенной поддержкой XPath 2.0 (Saxon Home Edition). Я не думаю, что это проблема.

4. @BocaBogdan, org.apache.xpath.objects. XString — это класс Xalan

5. @BocaBogdan Вы можете увидеть, как работает мое предложение (с использованием Saxon) здесь: xsltfiddle. liberty-development.net/6q1SDkK . Как говорит Мартин Хоннен, ошибка, которую вы получаете, исходит от Xalan. Код, который вы показываете в своем вопросе, возможно, не может работать в XSLT 1.0, поэтому вы должны были увидеть ошибку еще до попытки реализовать это.

Ответ №2:

Использование:


============================

Полный пример кода:


Когда это преобразование применяется к любому XML-документу (не используется), получается требуемый правильный результат:


)}»/>
</xsl:variable>Затем вы можете заполнить detail элемент с помощью:


и измените свои вызовы шаблонов, чтобы также использовать преимущества переменной.

Комментарии:

1. К сожалению, это ошибка, которую я получаю, когда определяю переменную invalidParams: Вызванную: java.lang. ClassCastException: класс org.apache.xpath.objects. XString не может быть приведен к классу org.apache.xpath.objects. XNodeSet Набор

2. @BocaBogdan, ваше сообщение об ошибке, похоже, исходит от Apache Xalan, который является процессором XSLT / XPath 1, непонятно, почему вы публикуете образцы, используя функцию, подобную matches той, которая была введена в XSLT / XPath 2, но попробуйте использовать процессор XSLT 1. В мире Java Saxon 9 или 10 можно использовать для выполнения XSLT / XPath 2 или с 2017 года даже 3.

3. @MartinHonnen, я использую WSO2 ESB с включенной поддержкой XPath 2.0 (Saxon Home Edition). Я не думаю, что это проблема.

4. @BocaBogdan, org.apache.xpath.objects. XString — это класс Xalan

5. @BocaBogdan Вы можете увидеть, как работает мое предложение (с использованием Saxon) здесь: xsltfiddle. liberty-development.net/6q1SDkK . Как говорит Мартин Хоннен, ошибка, которую вы получаете, исходит от Xalan. Код, который вы показываете в своем вопросе, возможно, не может работать в XSLT 1.0, поэтому вы должны были увидеть ошибку еще до попытки реализовать это.

Ответ №2:

Использование:


============================

Полный пример кода:


Когда это преобразование применяется к любому XML-документу (не используется), получается требуемый правильный результат:


))»>
<xsl:call-template name=«invalidParam2» />
</xsl:if>
</jsonArray>
</invalidParams>
<detail>
???
</detail>
</xsl:template>

Комментарии:

1. Вы не можете ожидать, что кто-то поможет вам, если вы не предоставите ввод и вывод или, по крайней мере, подробное объяснение.

2. Я добавил более подробную информацию в свой пост.

Ответ №1:

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


Затем вы можете заполнить detail элемент с помощью:


и измените свои вызовы шаблонов, чтобы также использовать преимущества переменной.

Комментарии:

1. К сожалению, это ошибка, которую я получаю, когда определяю переменную invalidParams: Вызванную: java.lang. ClassCastException: класс org.apache.xpath.objects. XString не может быть приведен к классу org.apache.xpath.objects. XNodeSet Набор

2. @BocaBogdan, ваше сообщение об ошибке, похоже, исходит от Apache Xalan, который является процессором XSLT / XPath 1, непонятно, почему вы публикуете образцы, используя функцию, подобную matches той, которая была введена в XSLT / XPath 2, но попробуйте использовать процессор XSLT 1. В мире Java Saxon 9 или 10 можно использовать для выполнения XSLT / XPath 2 или с 2017 года даже 3.

3. @MartinHonnen, я использую WSO2 ESB с включенной поддержкой XPath 2.0 (Saxon Home Edition). Я не думаю, что это проблема.

4. @BocaBogdan, org.apache.xpath.objects. XString — это класс Xalan

5. @BocaBogdan Вы можете увидеть, как работает мое предложение (с использованием Saxon) здесь: xsltfiddle. liberty-development.net/6q1SDkK . Как говорит Мартин Хоннен, ошибка, которую вы получаете, исходит от Xalan. Код, который вы показываете в своем вопросе, возможно, не может работать в XSLT 1.0, поэтому вы должны были увидеть ошибку еще до попытки реализовать это.

Ответ №2:

Использование:


============================

Полный пример кода:


Когда это преобразование применяется к любому XML-документу (не используется), получается требуемый правильный результат: