обрабатывать специальный символ в xsl для действительного JSON - PullRequest
1 голос
/ 04 мая 2020

У меня есть xml, который содержит специальный символ, и я использую xsl для преобразования этого xml в json. Однако он генерирует недопустимый json с ошибкой разбора.

вот мой ввод xml -

<?xml version="1.0" encoding="utf-8"?>
<root>
  <mydata>
    <data1>
      <Description>670054 [   CS\48] AGSB ON ROAD</Description>
    </data1>
  </mydata>
</root>

XSL, который я пытаюсь -

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" indent="yes" />
    <xsl:template match="/">
        {
        "Data":[{
        "ShortDescription":<xsl:value-of select="root/mydata/data1/Description"/>
        }]}
</xsl:stylesheet>

Ожидаемый результат -

 {
        "Data":[

            {
            "Id": "670054",
"ShortDescription": "670054 [   CS\48] AGSB ON ROAD"

        ]
        }

Любая помощь будет оценена!

Ответы [ 2 ]

1 голос
/ 04 мая 2020

XSLT 3.0 включает в себя функциональность для вывода JSON. В более ранних версиях вы можете сделать это «вручную», используя метод вывода текста, который вы здесь делаете. Но тогда вы несете полную ответственность за правильное форматирование вывода JSON, включая, в частности, экранирование специальных символов, таких как кавычки, переводы строки и обратный слеш. Это достаточно просто в XSLT 2.0 с использованием функции replace (); в XSLT 1.0 это более замысловато, хотя в exslt.org есть несколько шаблонов, которые вы можете включить в свою таблицу стилей, например, str: replace.

Когда вы задаете вопросы о XSLT на этом сайте, скажите, пожалуйста, какая версия XSLT (ы) вы можете использовать. Это часто имеет значение для ответа. Проблема в том, что XSLT 1.0 сейчас очень старый, но (как и COBOL) многие люди все еще используют его.

0 голосов
/ 06 мая 2020

Здесь я нашел одно решение для решения этой проблемы для действительных json.

<xsl:template name="handleBackSlash">
 <xsl:param name="string" select="."/>
  <xsl:choose>
    <xsl:when test="contains($string, '\')">
      <xsl:value-of select="concat(substring-before($string, '\'), '\\' )"/>
      <xsl:call-template name="handleBackSlash">
        <xsl:with-param name="string" select="substring-after($string, '\')"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="$string"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

, затем вызовите template-

 <xsl:call-template name="handleBackSlash">
        <xsl:with-param name="string" select="Description"/>
    </xsl:call-template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...