XSLT когда / иным образом выводить более одного раза - PullRequest
1 голос
/ 19 сентября 2019

У меня есть некоторый XSLT, который должен выводить один фрагмент текста PLAIN, зависящий от значений во входном XML-документе.

У меня есть предложение сопоставления шаблона, которое отфильтровывает узлы SIStatusHistory, когда значение «Status» в пределахэтот узел имеет значение «SRequested» ИЛИ «SCreated».Я не хочу, чтобы эти узлы оценивались.

РЕДАКТИРОВАТЬ:

Например, список подузлов:

 <SIHistories>
        <SIStatusHistory>
            <Created>2019-09-10T12:55:45.613</Created>
            <SIStat>
                <ServiceInstanceStatusId>5</ServiceInstanceStatusId>
                <Status>SRequested</Status>
            </SIStat>
        </SIStatusHistory>
        <SIStatusHistory>
            <Created>2019-09-10T13:06:37.153</Created>
            <SIStat>
                <ServiceInstanceStatusId>5</ServiceInstanceStatusId>
                <Status>SRejected</Status>
            </SIStat>
        </SIStatusHistory>
        <SIStatusHistory>
            <Created>2019-09-10T15:14:56.28</Created>
            <SIStat>
                <ServiceInstanceStatusId>5</ServiceInstanceStatusId>
                <Status>SRequested</Status>
            </SIStat>
        </SIStatusHistory>
    </SIHistories>

Должен быть сокращен до:

 <SIHistories>      
        <SIStatusHistory>
            <Created>2019-09-10T13:06:37.153</Created>
            <SIStat>
                <ServiceInstanceStatusId>5</ServiceInstanceStatusId>
                <Status>SRejected</Status>
            </SIStat>
        </SIStatusHistory>
    </SIHistories>

... и затем оценивается для Status = 'SRejected'

Когда первый узел SIStatusHistory имеет статус 'SRejected' ИЛИ ​​RAddress = 'Нет', это должно быть выведено:

"CheckQueue"

В противном случае выведите:

"CompQueue"

Проблема, с которой я сталкиваюсь, заключается в том, что XSLT, кажется, выполняется несколько раз для каждой подпрограммы.узел в моем предложении сопоставления с шаблоном.

Так (например) вместо

CompQueue

Я получаю вывод:

"CompQueueCompQueue"

Есть идеи?

Входной XML:

<SForm xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://test/p/s/types">
<SFID>00000</SFID>
<SID>00000</SID>
<FData>
    <FPH>
        <RAddress>No</RAddress>
        <FaultDescription>Text</FaultDescription>
        <Channel>P</Channel>
        <Customer/>
    </FPH>
    <ApplicantExt>
        <HasCommercialUse>Yes</HasCommercialUse>
    </ApplicantExt>
</FData>
<SIFormCounters />
<CompDate>2019-09-10T13:05:18.883</CompDate>
<SIHistories>
    <SIStatusHistory>
        <Created>2019-09-10T12:55:45.613</Created>
        <SIStat>
            <ServiceInstanceStatusId>5</ServiceInstanceStatusId>
            <Status>SRequested</Status>
        </SIStat>
    </SIStatusHistory>
    <SIStatusHistory>
        <Created>2019-09-10T13:06:37.153</Created>
        <SIStat>
            <ServiceInstanceStatusId>5</ServiceInstanceStatusId>
            <Status>SRejected</Status>
        </SIStat>
    </SIStatusHistory>
    <SIStatusHistory>
        <Created>2019-09-10T15:14:56.28</Created>
        <SIStat>
            <ServiceInstanceStatusId>5</ServiceInstanceStatusId>
            <Status>SRequested</Status>
        </SIStat>
    </SIStatusHistory>
</SIHistories>

XSLT:

 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pst="http://test/p/s/types" exclude-result-prefixes="pst" version="1.0">
  <xsl:output method="text" indent="no" />
 <xsl:template match="text()" />
  <xsl:template match="pst:SForm/pst:SIHistories/pst:SIStatusHistory[pst:SIStat/pst:Status='SCreated' or pst:SIStat/pst:Status='SRequested']">
   <xsl:choose>
      <xsl:when test="pst:SIHistories/pst:SIStatusHistory[1]/pst:SIStat/pst:Status = 'SRejected'">
        <xsl:text>CheckQueue</xsl:text>
      </xsl:when>
      <xsl:when test="pst:FormData/pst:FPH/pst:RAddress = 'No'">
        <xsl:text>CheckQueue</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text>CompQueue</xsl:text>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Мне нужно удалить все узлы, имеющие значение SCreated и SRequested, прежде чем мы оценим, является ли первый узел SRejected.

Я считаю, что это может быть реализовано как:

<xsl:template match="SIHistories">
    <xsl:variable name="first-status" select="SIStatusHistory[not(SIStat/Status='SCreated' or SIStat/Status='SRequested')][1]/SIStat/Status" />
    <xsl:choose>
        <xsl:when test="$first-status='SRejected'">CheckQueue</xsl:when>
        <xsl:otherwise>CompQueue</xsl:otherwise>
    </xsl:choose>
</xsl:template>
1 голос
/ 20 сентября 2019

В настоящее время для вашего шаблона есть два элемента, соответствующих условию pst: Status = 'SRequested' .Поскольку вы намереваетесь проверить первый, настройте шаблон с помощью position()=1 на первом узле.Кроме того, вам нужно вызвать ancestor::* или пройтись по дереву, чтобы проверить условие FData

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:pst="http://test/p/s/types" 
                exclude-result-prefixes="pst" version="1.0">
    <xsl:output method="text" indent="no" />
    <xsl:template match="text()" />

    <xsl:template match="pst:SForm/pst:SIHistories/pst:SIStatusHistory[position()=1 and (pst:SIStat/pst:Status='SCreated' or pst:SIStat/pst:Status='SRequested')]">
        <xsl:choose>
          <xsl:when test="pst:SIHistories/pst:SIStatusHistory[1]/pst:SIStat/pst:Status = 'SRejected'">
            <xsl:text>CheckQueue</xsl:text>
          </xsl:when>
          <xsl:when test="ancestor::pst:SForm/pst:FData/pst:FPH/pst:RAddress = 'No'">
            <xsl:text>CheckQueue</xsl:text>
          </xsl:when>
          <xsl:otherwise>
            <xsl:text>CompQueue</xsl:text>
          </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

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