У меня есть пример сообщения, которое нужно преобразовать в другую структуру вывода с помощью XSLT.
Входящее сообщение
<document>
<ObjectId>
<ID>1000909090</ID>
<dlex>
<attrGroupMany name="streetinfo">
<row> <!-- Mandatory Loop -->
<attr name="streetcode">AS_DRAINED</attr>
<attrQualMany name="streetintake"> <!-- Optional Loop -->
<value qual="en">dvif1</value>
<value qual="nl">dvif2</value>
</attrQualMany>
<attr name="streettype">BY_MEASURE</attr>
<attrQual name="streetbasis" qual="ONZ">5</attrQual>
<attrQual name="streetsize" qual="EA">1</attrQual>
<attrQualMany name="streetsizeDescription"> <!-- Optional Loop -->
<value qual="en">sz1</value>
<value qual="hi">sz2</value>
</attrQualMany>
<attrGroupMany name="streetDetails">
<row> <!-- Optional Loop -->
<attr name="streetTypeCode">FAT</attr>
<attr name="streetValueIntakePercent">25</attr>
<attr name="streetPrecisionCode">APPROXIMATELY</attr>
<attrQualMany name="streetContained"> <!-- Optional Loop -->
<value qual="ONZ">2</value>
<value qual="OZA">3</value>
</attrQualMany>
</row>
<row>
<attr name="streetTypeCode">FAMS</attr>
<attr name="streetValueIntakePercent">999</attr>
<attr name="streetPrecisionCode">EXACT</attr>
<attrQualMany name="streetContained">
<value qual="ONZ">4</value>
<value qual="OZA">5</value>
</attrQualMany>
</row>
</attrGroupMany>
</row>
</attrGroupMany>
</dlex>
</ObjectId>
</document>
Выходное сообщение
<?xml version="1.0" encoding="UTF-8"?>
<CatalogObjectId>
<RelationshipData>
<Relationship>
<RelationType>ObjectId_Street</RelationType>
<RelatedObjectIds>
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif1-en-sz1-en-FAT-2-ONZ" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif1-en-sz1-en-FAT-3-OZA" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif1-en-sz1-en-FAMS-4-ONZ" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif1-en-sz1-en-FAMS-5-OZA" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif1-en-sz2-hi-FAT-2-ONZ" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif1-en-sz2-hi-FAT-3-OZA" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif1-en-sz2-hi-FAMS-4-ONZ" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif1-en-sz2-hi-FAMS-5-OZA" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif2-nl-sz1-en-FAT-2-ONZ" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif2-nl-sz1-en-FAT-3-OZA" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif2-nl-sz1-en-FAMS-4-ONZ" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif2-nl-sz1-en-FAMS-5-OZA" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif2-nl-sz2-hi-FAT-2-ONZ" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif2-nl-sz2-hi-FAT-3-OZA" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif2-nl-sz2-hi-FAMS-4-ONZ" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif2-nl-sz2-hi-FAMS-5-OZA" />
</RelatedObjectIds>
</Relationship>
</RelationshipData>
</CatalogObjectId>
Это отлично работает, когда мы используем приведенный ниже XSLT.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="document">
<CatalogObjectId>
<RelationshipData>
<Relationship>
<RelationType>ObjectId_Street</RelationType>
<RelatedObjectIds>
<xsl:for-each select="ObjectId/dlex/attrGroupMany[@name='streetinfo']/row">
<xsl:variable name="v_position_streetinfo" select="position()" />
<xsl:variable name="v_streetcode">
<xsl:value-of select="attr[@name='streetcode'])"/>
</xsl:variable>
<xsl:variable name="v_streetintake" select="attrQualMany[@name = 'streetintake']/value" />
<xsl:variable name="v_streetsizeDescription" select="attrQualMany[@name = 'streetsizeDescription']/value" />
<xsl:variable name="v_streetDetails" select="attrGroupMany[@name = 'streetDetails']/row" />
<xsl:for-each select="$v_streetintake">
<xsl:variable name="v_streetintakevalue" select="." />
<xsl:variable name="v_streetintakequal" select="./@qual" />
<xsl:for-each select="$v_streetsizeDescription">
<xsl:variable name="v_streetsizeDescriptionvalue" select="." />
<xsl:variable name="v_streetsizeDescriptionqual" select="./@qual" />
<xsl:for-each select="$v_streetDetails">
<xsl:variable name="v_streetTypeCode">
<xsl:value-of select="attr[@name='streetTypeCode'])"/>
</xsl:variable>
<xsl:variable name="v_streetContained" select="attrQualMany[@name = 'streetContained']/value" />
<xsl:for-each select="$v_streetContained">
<xsl:variable name="v_streetContainedvalue" select="." />
<xsl:variable name="v_streetContainedqual" select="./@qual" />
<RelatedObjectId>
<xsl:attribute name="referenceKey">
<xsl:value-of select="concat('ObjectId_Street','-',$v_position_streetinfo,'-',$v_streetcode,'-',$v_streetintakevalue,'-',$v_streetintakequal,'-',$v_streetsizeDescriptionvalue,'-',$v_streetsizeDescriptionqual,'-',$v_streetTypeCode,'-',$v_streetContainedvalue,'-',$v_streetContainedqual)"/>
</xsl:attribute>
</RelatedObjectId>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</RelatedObjectIds>
</Relationship>
</RelationshipData>
</CatalogObjectId>
</xsl:template>
</xsl:stylesheet>
Но это не работает, когда ни один из необязательных циклов не приходит. Я написал XSLT, когда присутствуют все необязательные циклы. Как я могу написать XSLT, когда в сообщении появляется какая-либо 1, 2, или 3, или ни одна из необязательных групп. Пожалуйста, предложите
Ожидаемый результат
Когда первая необязательная группа отсутствует, на выходе будет 8 записей.
<?xml version="1.0" encoding="UTF-8"?>
<CatalogObjectId>
<RelationshipData>
<Relationship>
<RelationType>ObjectId_Street</RelationType>
<RelatedObjectIds>
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED--en-sz1-en-FAT-2-ONZ" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED--en-sz1-en-FAT-3-OZA" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED--en-sz1-en-FAMS-4-ONZ" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED--en-sz1-en-FAMS-5-OZA" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED--en-sz2-hi-FAT-2-ONZ" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED--en-sz2-hi-FAT-3-OZA" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED--en-sz2-hi-FAMS-4-ONZ" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED--en-sz2-hi-FAMS-5-OZA" />
</RelatedObjectIds>
</Relationship>
</RelationshipData>
</CatalogObjectId>
Когда первая и вторая необязательные группы отсутствуют, на выходе будет 4 записи.
<?xml version="1.0" encoding="UTF-8"?>
<CatalogObjectId>
<RelationshipData>
<Relationship>
<RelationType>ObjectId_Street</RelationType>
<RelatedObjectIds>
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED--en--en-FAT-2-ONZ" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED--en--en-FAT-3-OZA" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED--en--en-FAMS-4-ONZ" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED--en--en-FAMS-5-OZA" />
</RelatedObjectIds>
</Relationship>
</RelationshipData>
</CatalogObjectId>