Преобразование XSLT: перемещение содержимого узлов в один узел - PullRequest
0 голосов
/ 02 мая 2020

У меня следующие XML:

<EAD:c>
  <EAD:accessrestrict type="aaa">
    <EAD:p>
      value1
    </EAD:p>
  </EAD:accessrestrict>
  <EAD:accessrestrict type="bbb">
    <EAD:p>
      value2
    </EAD:p>
  </EAD:accessrestrict>
</EAD:c>

есть несколько <EAD:c> узлов, и не все из них обязательно имеют <EAD:accessrestrict type="aaa"> или <EAD:accessrestrict type="bbb">

результат после преобразования должно быть:

<EAD:c>
  <EAD:accessrestrict>
    <EAD:p>
      value1; value2;
    </EAD:p>
  </EAD:accessrestrict>
</EAD:c>

Я понятия не имею, как это сделать, ваша помощь очень ценится!

1 Ответ

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

Вы можете сделать это так:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:EAD="http://www.somens.com"
    version="1.0">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <outputDoc>
      <xsl:apply-templates/>
    </outputDoc>
  </xsl:template>

  <xsl:template match="EAD:c">
      <xsl:copy>
        <EAD:accessrestrict>
          <EAD:p>
            <xsl:for-each select="EAD:accessrestrict/EAD:p">
              <xsl:value-of select="normalize-space(.)"/>
              <xsl:if test="position()!=last()"><xsl:text>; </xsl:text></xsl:if>
              <xsl:if test="position()=last()"><xsl:text>;</xsl:text></xsl:if>
            </xsl:for-each>
          </EAD:p>
        </EAD:accessrestrict>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Посмотрите, как это работает здесь: https://xsltfiddle.liberty-development.net/gVhDDz1

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