Проверьте множественные теги, если значение пусто с XSLT - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть следующее XML

<?xml version="1.0" encoding="utf-8"?>
<Subjects>
  <Subject>
    <Title>Mr</Title>
    <Firstname></Firstname>
    <Surname></Surname>
    <Email></Email>
    <Incidents>
      <Incident>
        <ReferenceNo>meuen</ReferenceNo>
      </Incident>
    </Incidents>
    <TelephoneNos />
    <Employers />
    <BankAccounts />
  </Subject>
  <Subject>
    <Title>Mr</Title>
    <Firstname>Test</Firstname>
    <Surname>Test</Surname>
    <Email>test@test.com</Email>
    <Incidents>
      <Incident>
        <ReferenceNo>jkcsdlkjsdl</ReferenceNo>
      </Incident>
    </Incidents>
    <TelephoneNos />
    <Employers />
    <BankAccounts />
  </Subject>
</Subjects>

Мне нужно проверить, являются ли поля ReferenceNo пустыми, используя XSLT

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:x="http://tempuri.org/">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 

    <xsl:template match="/">
        <Result xmlns="http://tempuri.org/">

            <xsl:for-each select="/Subjects/Subject">

                <xsl:variable name="output" select="Incidents/Incident/ReferenceNo"/>
                <xsl:choose>
                    <xsl:when test="string-length($output) > 0">
                        <Response>Y</Response>
                    </xsl:when>
                    <xsl:otherwise>
                        <Response>N</Response>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each>

        </Result>
    </xsl:template>

</xsl:stylesheet>

Но это проверяет только первый узел, а не оба или все теги ReferenceNo.

Как мне добиться sh этого результата.

Я пробовал это в xsl: foeach, это, очевидно, будет повторять мои tag1 и tag2 дважды в случае вышеупомянутых узлов XML

Я хочу, чтобы response было значением Y, если заполнен любой из тегов, и N, если ни один из них не заполнен.

Это текущий ответ, который я получаю

<Result xmlns="http://tempuri.org/" xmlns:x="http://tempuri.org/">
   <Response>Y</Response>
   <Response>Y</Response>
</Result>

Я не хочу, чтобы Response повторялся

1 Ответ

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

Этот тест:

<xsl:when test="Subjects/Subject/Incidents/Incident/ReferenceNo[string-length() > 0]">

или, если вы предпочитаете:

<xsl:when test="Subjects/Subject/Incidents/Incident/ReferenceNo[text()]">

, вернет true, если есть хотя бы один непустой элемент ReferenceNo.

Тест может (и должен) применяться из контекста узла / root. Нет необходимости в инструкции xsl:for-each.

...