Не выбирать определенные дочерние элементы узла в xslt, используя not - PullRequest
0 голосов
/ 09 июля 2020

Мой XML ниже. Можно ли сделать это в том же XSLT?

<response context="XXXX" type="abcd" errorCode="0" >
<output>
    <Applicants>
        <Applicant>
            <IndividualEmployments/>
            <Addresses/>
        </Applicant>
    </Applicants>
    <Assets>
        <Asset id="12345"></Asset>
    </Assets>
    <Liabilities>
        <Liability id="8765"></Liability>
    </Liabilities>
</output>

Желаемый результат должен быть таким, как показано ниже. Мне нужны два узла ответа: один с Assets , а другой с Liabilities .

<response context="XXXX" type="abcd" errorCode="0">
<output>
    <Applicants>
        <Applicant>
            <IndividualEmployments/>
            <Addresses/>
        </Applicant>
    </Applicants>
    <Assets>
    <Asset id="12345"></Asset>
</Assets>        
</output>
<response context="XXXX" type="abcd" errorCode="0">
<output>
    <Applicants>
        <Applicant>
            <IndividualEmployments/>
            <Addresses/>
        </Applicant>
    </Applicants>
    <Liabilities>
        <Liability id="8765"></Liability>
    </Liabilities>     
</output>

1 Ответ

0 голосов
/ 09 июля 2020

Вам нужно обработать элемент response и вывести его дважды, убедившись, что содержимое отличается, например, передав параметр:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="#all"
  expand-text="yes">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="response">
    <xsl:next-match>
      <xsl:with-param name="exclude" tunnel="yes" select="descendant::Liabilities"/>
    </xsl:next-match>
        <xsl:next-match>
      <xsl:with-param name="exclude" tunnel="yes" select="descendant::Assets"/>
    </xsl:next-match>
  </xsl:template>
  
  <xsl:template match="output">
    <xsl:param name="exclude" tunnel="yes"/>
    <xsl:copy>
      <xsl:apply-templates select="@*, node() except $exclude"/>
    </xsl:copy>
  </xsl:template>
  
</xsl:stylesheet>

При необходимости или желании вы, конечно, можете обернуть каждый xsl:next-match У меня в xsl:result-document.

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