У меня есть некоторый 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>