我有这样的 xml:
<ROWSET>
<ROW>
<FLD1>P2</FLD1>
<S_VAL>1</S_VAL>
<FLD2>N2</FLD2>
</ROW>
<ROW>
<FLD1>P3</FLD1>
<S_VAL>2</S_VAL>
<FLD2>N2</FLD2>
</ROW>
<ROW>
<FLD1>P3</FLD1>
<S_VAL>3</S_VAL>
<FLD2>N2</FLD2>
</ROW>
<ROW>
<FLD1>P4</FLD1>
<S_VAL>4</S_VAL>
<FLD2>N3</FLD2>
</ROW>
<ROW>
<FLD1>P2</FLD1>
<S_VAL>5</S_VAL>
<FLD2>N3</FLD2>
</ROW>
</ROWSET>
我的 xsl 中有 2 个变量:
<xsl:variable name="only_need" select="/ROWSET/ROW[./FLD2='N2']"/>
<xsl:variable name="only_need2" select="$only_need/FLD1[not(.=following::FLD1)]"/>
在名称为“only_need”的变量中,我收到 S_Val IN (1, 2, 3) 的记录。 但在名称为“only_need2”的变量中,我只收到 FLD1 = P3。 为什么第二个变量只接收 FLD1 = P3 的问题?
最佳答案
only_need2
包含 only_need
中那些值与以下所有 FLD1
值不同的行的 FLD1
子级整个文档中的 > 元素,而不仅仅是 only_need
中的元素。因此,您不会得到 P2
,因为稍后(第五行)还有另一个 P2
。
如果您想要的实际上是每个不同 FLD1
值的 only_need
的最后一行,您可以使用键来实现 p>
<xsl:key name="key_only_need2" match="/ROWSET/ROW[FLD2='N2']/FLD1" use="." />
<xsl:variable name="only_need2" select="$only_need/FLD1[
generate-id() = generate-id( key('key_only_need2', .)[last()] )]" />
我在这里所做的是定义一个键,该键将从 FLD2
为 N2
的行中提取所有 FLD1
元素并将它们分组通过其 FLD1
值。变量声明中的谓词使用此键仅选择每个组中的最后一个元素。
关于xslt - xsl "following"返回的不是预期的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12636539/