Дублируйте узел и дочерние элементы, если это происходит только один раз - PullRequest
0 голосов
/ 11 января 2019

Мне нужно продублировать узел и его дочерние элементы, если это происходит только один раз в xml. В противном случае XML не должен быть изменен. Например, в приведенном ниже XML-коде, если <dataList> встречается только один раз, дублируйте его еще раз. Если нет, не меняйте xml вообще. Только XSLT 1.0, пожалуйста.

Input XML

 <?xml version="1.0" encoding="UTF-8"?>
<API>
   <Token/>
   <root>
     <dataList>
        <addressOne>1</addressOne>
        <addressTwo/>
        <bkdn/>
     </dataList>
   </root>
 </API>

Ожидаемый вывод xml

<?xml version="1.0" encoding="UTF-8"?>
 <API>
   <Token/>
   <root>
      <dataList>
         <addressOne>1</addressOne>
         <addressTwo/>
         <bkdn/>
      </dataList>
      <dataList>
         <addressOne>1</addressOne>
         <addressTwo/>
         <bkdn/>
       </dataList>
     </root>
</API>

1 Ответ

0 голосов
/ 11 января 2019

Согласно моему пониманию, я хочу решить это:

<?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="1.0">

    <xsl:output indent="yes"/>

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

    <xsl:template match="root">
        <xsl:copy>

        <xsl:choose>

            <!-- If you are looking for the dataList occurance then use count -->
            <xsl:when test="count(dataList) = 1">

            <!-- If you are looking for the dataList/addressOne value = 1 occurance then use below -->

        <!-- <xsl:when test="dataList/addressOne=1"> -->
                <xsl:apply-templates select="dataList"/>
                <xsl:apply-templates select="dataList"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:apply-templates select="dataList"/>
            </xsl:otherwise>
        </xsl:choose>
        </xsl:copy>
    </xsl:template>



</xsl:stylesheet>
...