xslt заменяет пустой массив пустышкой - PullRequest
3 голосов
/ 31 октября 2019

У меня есть запрос JSON, такой как

{
  "aaaa": []
}

Сначала мне нужно проверить, существует ли aaaa в моей полезной нагрузке запроса, если существует, как указано выше, мне нужно добавить jsonObject с фиктивными атрибутами и значениями, такими как:

{
  "aaaa": [
    {
     "@c": "test"
      "a": "99999",
      "b": "test",
      "c": "test"
    }
],

Если aaaa не существует в моей полезной нагрузке, мне нужно добавить его с его фиктивными атрибутами и значениями. Таким образом, если полезная нагрузка равна {}, после xslt это должен быть тот же JSON, что и выше. В своем преобразовании я попытался решить эту проблему следующим образом:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="//jsonObject">
        <xsl:copy>
            <xsl:if test="//jsonObject/not(aaaa)">
                <aaaa>
                    <xsl:attribute name="c">test</xsl:attribute>
                    <a>99999</a>
                    <b>test</b>
                    <c>test</c>
                </aaaa>
            </xsl:if>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="//jsonObject/aaaa">
        <xsl:copy>
            <xsl:attribute name="c">test</xsl:attribute>
            <a>99999</a>
            <b>test</b>
            <c>test</c>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

С помощью этого запроса:

{
  "aaaa": []
}

Я не вижу массив aaaa и его фиктивные атрибуты после преобразования.

Спасибо за любой совет!

1 Ответ

0 голосов
/ 31 октября 2019

Из документации WSO2

JSON:

{"array":[]}

XML (JsonStreamBuilder):

<jsonObject></jsonObject>

XML (JsonBuilder):

<jsonObject>
   <?xml-multiple array?>
</jsonObject>

Когда я запускаю ваше преобразование с обоими выходами, я получаю

<jsonObject>
   <aaaa c="test">
      <a>99999</a>
      <b>test</b>
      <c>test</c>
   </aaaa>
</jsonObject>

И

<jsonObject>
   <aaaa c="test">
      <a>99999</a>
      <b>test</b>
      <c>test</c>
   </aaaa>
   <?xml-multiple array?>
</jsonObject>

Примечание: Я не говорю, что поддерживаю вашу таблицу стилей. Я бы лучше использовал:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="jsonObject[not(aaaa)]">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
            <aaaa c="test">
                <a>99999</a>
                <b>test</b>
                <c>test</c>
            </aaaa>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
...