Добавить новый тег, если тег не существует - PullRequest
0 голосов
/ 19 марта 2019

У меня есть входной XML и я хочу добавить новые теги, если теги не существуют в XML.

<xsl:template match="jsonObject[not(aaa)]">
  <xsl:copy>
   <xsl:apply-templates select="@*"/>

     <aaa>test</aaa>
   <xsl:apply-templates select="node()"/>
  </xsl:copy>
    </xsl:template>

    <xsl:template match="jsonObject[not(bbb)]">
  <xsl:copy>
   <xsl:apply-templates select="@*"/>

     <bbb>test2</bbb>
   <xsl:apply-templates select="node()"/>
  </xsl:copy>
    </xsl:template>

Входное сообщение

<jsonObject>
   <ttt>xxxx</ttt>
   <ppp>yyy</ppp>
   <mmm>zzz</mmm>
   <ddd>00000</ddd>
<jsonObject>

ожидаемое сообщение

<jsonObject>
   <aaa>test</aaa>
   <bbb>test2</bbb>
   <ttt>xxxx</ttt>
   <ppp>yyy</ppp>
   <mmm>zzz</mmm>
   <ddd>00000</ddd>
<jsonObject>

Но из шаблона я реализовал только последний тег, добавленный во входное сообщение.

Полученное сообщение

<jsonObject>
   <bbb>test2</bbb>
   <ttt>xxxx</ttt>
   <ppp>yyy</ppp>
   <mmm>zzz</mmm>
   <ddd>00000</ddd>
<jsonObject>

Есть ли какие-либо проблемы в моем шаблоне?

Ответы [ 2 ]

4 голосов
/ 19 марта 2019

Если у вас есть jsonObject, у которого нет ни элемента aaa, ни bbb, тогда оба шаблона будут совпадать с одинаковым приоритетом, что считается ошибкой.

Что вы можете сделать, этопросто иметь шаблон, соответствующий всем jsonObject элементам, и иметь xsl:if проверок внутри

<xsl:template match="jsonObject">
<xsl:copy>
  <xsl:apply-templates select="@*"/>
  <xsl:if test="not(aaa)">
     <aaa>test</aaa>
  </xsl:if>
  <xsl:if test="not(bbb)">
     <bbb>test2</bbb>
  </xsl:if>
  <xsl:apply-templates />
</xsl:copy>
</xsl:template>
1 голос
/ 19 марта 2019

Полный XSLT похож на:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:output indent="yes"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="jsonObject">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:if test="not(aaa)">
                <aaa>test</aaa>
            </xsl:if>
            <xsl:if test="not(bbb)">
                <bbb>test2</bbb>
            </xsl:if>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>


</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...