Разделить xml элемент в зависимости от размера - PullRequest
0 голосов
/ 23 апреля 2020

Учитывая следующий XML файл примера:

<root>
<UserList>
    <UserDetails>
        <Info1>
            <Info1_Id>AA</Info1_Id>
        </Info1>
        <Info2>
            <Info2_Id>BB</Info2_Id>
        </Info2>
    </UserDetails>
    <UserAddress>
        <State>Maharastra</State>
        <AddressDetails>
            <City>Mumbai</City>
            <Address>Andheri Kurla Road, Mumbai</Address>
        </AddressDetails>
    </UserAddress>
    <UserAddress>
        <State>Karnataka</State>
        <AddressDetails>
            <City>Bangalore</City>
            <Address>ITPL Bangalore</Address>
        </AddressDetails>
        <AddressDetails>
            <City>Bangalore</City>
            <Address>XYZ Services Ltd in Whitefield Main Road, Bangalore</Address>
        </AddressDetails>
    </UserAddress>
</UserList>

Я хочу выполнить XSL-преобразование для разделения и дублирования элемента, если длина адреса больше 30. Если адрес длина более 30, первый элемент будет содержать первые 30 символов, а новый (дублированный) элемент будет содержать следующие 30 символов, и т. д.

ожидаемый результат:

<root>
<UserList>
    <UserDetails>
        <Info1>
            <Info1_Id>AA</Info1_Id>
        </Info1>
        <Info2>
            <Info2_Id>BB</Info2_Id>
        </Info2>
    </UserDetails>
    <UserAddress>
        <State>Maharastra</State>
        <AddressDetails>
            <City>Mumbai</City>
            <Address>Andheri Kurla Road, Mumbai</Address>
        </AddressDetails>
    </UserAddress>
    <UserAddress>
        <State>Karnataka</State>
        <AddressDetails>
            <City>Bangalore</City>
            <Address>ITPL Bangalore</Address>
        </AddressDetails>
        <AddressDetails>
            <City>Bangalore</City>
            <Address>XYZ Services Ltd in Whitefield</Address>
        </AddressDetails>
        <AddressDetails>
            <City>Bangalore</City>
            <Address> Main Road, Bangalore</Address>
        </AddressDetails>
    </UserAddress>
</UserList>

Как это может быть достигнуто. Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 24 апреля 2020

Это будет обрабатывать только адреса длиной до 90 символов. Но вы можете расширить это, добавив дополнительные if в шаблон AddressDetails в соответствии с шаблоном.

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:exslt ="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="exslt">
      <xsl:output method="xml" indent="yes"/>


    <xsl:template match="AddressDetails">
      <xsl:copy>
        <xsl:apply-templates select="node() | @*">
          <xsl:with-param name="address" select="substring(Address, 1, 30)"/>
        </xsl:apply-templates>
      </xsl:copy>
      <xsl:if test="string-length(Address) &gt; 30">
        <xsl:copy>
          <xsl:apply-templates select="node() | @*">
            <xsl:with-param name="address" select="substring(Address, 31, 30)"/>
          </xsl:apply-templates>
        </xsl:copy>
      </xsl:if>
      <xsl:if test="string-length(Address) &gt; 60">
        <xsl:copy>
          <xsl:apply-templates select="node() | @*">
            <xsl:with-param name="address" select="substring(Address, 61, 30)"/>
          </xsl:apply-templates>
        </xsl:copy>
      </xsl:if>
      <!-- etc. -->
    </xsl:template>

    <xsl:template match="Address">
      <xsl:param name="address"/>
      <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:value-of select="$address"/>
      </xsl:copy>
    </xsl:template>

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


  </xsl:stylesheet>
...