#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-документу (не используется), получается требуемый правильный результат: