XSLT中的增量计数器
我有一个XML,由于在两个地方出现attrQualMany,每个地方有2个值,所以循环了4次。 所以2*2 示例XML消息是XSLT中的增量计数器,xslt,xslt-1.0,xslt-2.0,xslt-grouping,Xslt,Xslt 1.0,Xslt 2.0,Xslt Grouping,我有一个XML,由于在两个地方出现attrQualMany,每个地方有2个值,所以循环了4次。 所以2*2 示例XML消息是 <document> <ObjectId> <ID>1000909090</ID> <dlex> <attrGroupMany name="streetinfo"> <row>
<document>
<ObjectId>
<ID>1000909090</ID>
<dlex>
<attrGroupMany name="streetinfo">
<row>
<attr name="streetcode">AS_DRAINED</attr>
<attrQualMany name="streetintake">
<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">
<value qual="en">sz1</value>
<value qual="hi">sz2</value>
</attrQualMany>
</row>
</attrGroupMany>
</dlex>
</ObjectId>
</document>
1000909090
当你耗尽
dvif1
dvif2
按比例
5.
1.
sz1
sz2
我正在使用下面的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']">
<xsl:variable name="pos" select="position()"/>
<xsl:apply-templates select="row" mode="streetintake">
<xsl:with-param name="referenceKey" select="concat('ObjectId_Street-',$pos)" />
</xsl:apply-templates>
</xsl:for-each>
</RelatedObjectIds>
</Relationship>
</RelationshipData>
</CatalogObjectId>
</xsl:template>
<xsl:template match="row" mode="streetintake">
<xsl:param name="referenceKey" />
<xsl:variable name="streetcode" select="concat($referenceKey,'-',attr[@name='streetcode'],'-')"/>
<xsl:choose>
<xsl:when test="attrQualMany[@name='streetintake']/value">
<xsl:for-each select="attrQualMany[@name='streetintake']/value">
<xsl:apply-templates select="../.." mode="streetsize">
<xsl:with-param name="referenceKey" select="concat($streetcode,text(),'-',@qual)" />
</xsl:apply-templates>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="." mode="streetsize">
<xsl:with-param name="referenceKey" select="$streetcode" />
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="row" mode="streetsize">
<xsl:param name="referenceKey" />
<xsl:choose>
<xsl:when test="attrQualMany[@name='streetsizeDescription']/value">
<xsl:for-each select="attrQualMany[@name='streetsizeDescription']/value">
<xsl:call-template name="RelatedObjectId">
<xsl:with-param name="referenceKey" select="concat($referenceKey,'-',text(),'-',@qual)" />
</xsl:call-template>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="RelatedObjectId">
<xsl:with-param name="referenceKey" select="$referenceKey" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="RelatedObjectId">
<xsl:param name="referenceKey" />
<RelatedObjectId>
<xsl:attribute name="referenceKey">
<xsl:variable name="v_pos" select="position()"/>
<xsl:value-of select="concat($referenceKey,'-',$v_pos)" />
</xsl:attribute>
</RelatedObjectId>
</xsl:template>
</xsl:stylesheet>
德佑街
我得到的电流输出是
<?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-1" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif1-en-sz2-hi-2" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif2-nl-sz1-en-1" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif2-nl-sz2-hi-2" />
</RelatedObjectIds>
</Relationship>
</RelationshipData>
</CatalogObjectId>
德佑街
但是我想要每个循环的增量,预期的输出应该是
<?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-1" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif1-en-sz2-hi-2" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif2-nl-sz1-en-3" />
<RelatedObjectId referenceKey="ObjectId_Street-1-AS_DRAINED-dvif2-nl-sz2-hi-4" />
</RelatedObjectIds>
</Relationship>
</RelationshipData>
</CatalogObjectId>
德佑街
你能告诉我我应该把位置计数器放在哪里吗?我尝试了很多组合,但是运气不好。让我们把示例减少到演示问题所需的最低限度。考虑到以下输入: XML
<row>
<attr name="A">
<value>A</value>
<value>B</value>
<value>C</value>
<value>D</value>
</attr>
<attr name="B">
<value>X</value>
<value>Y</value>
<value>Z</value>
</attr>
</row>
A.
B
C
D
X
Y
Z
以下样式表:
XSLT1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="row">
<objects>
<xsl:for-each select="attr[@name='A']/value">
<xsl:variable name="i" select="position()"/>
<xsl:for-each select="../../attr[@name='B']/value">
<object>
<xsl:value-of select="($i - 1) * last() + position()" />
</object>
</xsl:for-each>
</xsl:for-each>
</objects>
</xsl:template>
</xsl:stylesheet>
将返回:
结果
<?xml version="1.0" encoding="UTF-8"?>
<objects>
<object>1</object>
<object>2</object>
<object>3</object>
<object>4</object>
<object>5</object>
<object>6</object>
<object>7</object>
<object>8</object>
<object>9</object>
<object>10</object>
<object>11</object>
<object>12</object>
</objects>
1.
2.
3.
4.
5.
6.
7.
8.
9
10
11
12