У меня есть входящее XML Я хотел преобразовать в другой формат. Я не получаю желаемого результата.
Входящие XML:
<aggResponse>
<services>
<serviceIdentifier>vStatus</serviceIdentifier>
<Access>Allow</Access>
</services>
<services>
<serviceIdentifier>vAccess</serviceIdentifier>
<Access>Reject</Access>
<ErrorCode>200504</ErrorCode>
</services>
<services>
<serviceIdentifier>vLavel</serviceIdentifier>
<Access>Allow</Access>
</services>
</aggResponse>
Требуется вывод:
<NS1:Response xmlns:NS1="http://test.com">
<NS1:checkDetail>
<NS1:Detail>
<NS1:AuthCheckType>vStatus</NS1:AuthCheckType>
<NS1:Result>Allow</NS1:Result>
<NS1:ErrorCode />
<NS1:checkDetail />
</NS1:Detail>
<NS1:Detail>
<NS1:AuthCheckType>vAccess</NS1:AuthCheckType>
<NS1:Result>Allow</NS1:Result>
<NS1:ErrorCode />
<NS1:checkDetail />
</NS1:Detail>
<NS1:Detail>
<NS1:AuthCheckType>vLavel</NS1:AuthCheckType>
<NS1:Result>Reject</NS1:Result>
<NS1:ErrorCode>200504</NS1:ErrorCode>
<NS1:checkDetail />
</NS1:Detail>
</NS1:checkDetail>
<NS1:Access>Reject</NS1:Access>
<NS1:ErrorCode>200504</NS1:ErrorCode>
</NS1:Response>
Я использую приведенный ниже XSLT для преобразования. XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dp="http://www.datapower.com/extensions" xmlns:dpconfig="http://www.datapower.com/param/config" version="1.0" extension-element-prefixes="dp" exclude-result-prefixes="dp dpconfig">
<xsl:output method="xml" />
<xsl:template match="/">
<xsl:variable name="overallAccess" select="'Allow'" />
<xsl:variable name="errorCode" select="0" />
<NS1:Response xmlns:NS1="http://test.com">
<NS1:checkDetail>
<xsl:for-each select="//*[local-name()='aggResponse']/*[local-name()='services']">
<NS1:Detail>
<NS1:AuthCheckType>
<xsl:value-of select="*[local-name()='serviceIdentifier']" />
</NS1:AuthCheckType>
<NS1:Result>
<xsl:value-of select="*[local-name()='Access']" />
</NS1:Result>
<NS1:ErrorCode>
<xsl:value-of select="*[local-name()='ErrorCode']" />
</NS1:ErrorCode>
<xsl:variable name="overallAccesstemp">
<xsl:value-of select="*[local-name()='Access']" />
</xsl:variable>
<xsl:variable name="authAccess">
<xsl:choose>
<xsl:when test="$overallAccesstemp='Reject'">
<xsl:variable name="overallAccess" select="'Reject'" />
<xsl:variable name="errorCode" select="*[local-name()='ErrorCode']" />
</xsl:when>
<xsl:when test="$overallAccesstemp='Reject_needmorepoint' and $overallAccess='Allow' ">
<xsl:variable name="overallAccess" select="'Reject_needmorepoint'" />
<xsl:variable name="errorCode" select="*[local-name()='ErrorCode']" />
</xsl:when>
<xsl:otherwise>
<xsl:variable name="overallAccess" select="'Allow'" />
<xsl:variable name="errorCode" select="0" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<NS1:checkDetail />
</NS1:Detail>
</xsl:for-each>
</NS1:checkDetail>
<NS1:Access>
<xsl:value-of select="$authAccess" />
</NS1:Access>
<NS1:ErrorCode>
<xsl:value-of select="$errorCode" />
</NS1:ErrorCode>
</NS1:Response>
</xsl:template>
</xsl:stylesheet>
Входящий XML - это динамический c, означающий, что значение тега «Доступ» может быть либо 1. Разрешить, 2. Отклонить, 3. Отклонить_morepoint. . условие 1. поэтому, если все как «Разрешить», то окончательный доступ - это «Разрешить», условие 2. если хотя бы одно - «Отклонить», то окончательный доступ - «Отклонить». Условие 3: если все - Reject_morepoint, окончательный доступ - Reject_morepoint. Для Разрешить код ошибки всегда будет 0, а во всех остальных случаях это должен быть код ошибки, который мы получаем из входящего запроса. Вот почему я пытался записать logi c внутри для l oop, что не совсем работает.
Может кто-нибудь подскажет, в чем проблема в xslt. Как получить желаемый результат