Я написал несколько XSLT, которые используют один XML-документ для фильтрации другого. Теперь я хотел бы указать свои выходные элементы, используя position()
, но мое условие фильтрации не встроено в мой <xsl:for-each>
, поэтому position()
дает мне результаты с нумерационными пробелами. Как избавиться от пробелов?XSLT-фильтр с индексным счетчиком
<xsl:variable name="Astring">
<a><b>10</b><b>20</b><b>30</b></a>
</xsl:variable>
<xsl:variable name="A" select="msxml:node-set($Astring)" />
<xsl:variable name="Bstring">
<c><d>20</d><d>30</d></c>
</xsl:variable>
<xsl:variable name="B" select="msxml:node-set($Bstring)" />
<e>
<xsl:for-each select="$A/a/b">
<xsl:variable name="matchvalue" select="text()" />
<xsl:if test="count($B/c/d[text() = $matchvalue]) > 0">
<xsl:element name="f">
<xsl:attribute name="i">
<xsl:value-of select="position()" />
</xsl:attribute>
<xsl:copy-of select="text()" />
</xsl:element>
</xsl:if>
</xsl:for-each>
</e>
Вот результат:
<e>
<f i="2">20</f>
<f i="3">30</f>
</e>
... но я хочу это:
<e>
<f i="1">20</f>
<f i="2">30</f>
</e>
Есть ли способ, чтобы включить выше тест <xsl:if>
фильтрации внутри атрибута <xsl:for-each>
select
?
Примечание: я видел this question re: filtering и this one re: счетчики, но первый не подсчитывает своих результатов, а последний использует position().
Блестяще, спасибо! Я попытался переместить условие в мое для каждого, но встретил разочарование, пытаясь сделать это следующим образом: $ A/a/b [count ($ B/c/d [<некоторое условие соответствия здесь>])> 0] –