我有这样的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?
答案 0 :(得分:1)
only_need2
包含FLD1
中这些行的only_need
个孩子,其值与整个文档中所有FLD1
元素的值不同,而不仅仅是only_need
。所以你没有得到P2
,因为之后还有另一个P2
(在第五行)。
如果你想要的实际上是每个不同only_need
值的FLD1
的最后一行,你可以使用密钥
<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()] )]" />
我在这里做的是定义一个密钥,该密钥将从FLD1
为FLD2
的行中提取所有N2
个元素,并按其FLD1
值对其进行分组。变量声明中的谓词使用此键仅从每个组中选择 last 元素。
答案 1 :(得分:0)
这回答了你对Ian Roberts给出的好答案的评论提出的问题:
你能告诉我,我怎样才能将“跟随”用于“only_need”
实际上,这是一个纯粹的XPath问题。
可以避免使用键,只需使用“前”或“跟随”之类的轴来查找“不同”元素,但要记住这很慢 - O(N ^ 2)与使用密钥相关 - (O(N)):
<xsl:variable name="vOnlyNeed" select="/*/*[FLD2='N2']"/>
<xsl:variable name="vOnlyNeedDistinct" select=
"$vOnlyNeed
[not(FLD1
=
following::*
[count(.|$vOnlyNeed) = count($vOnlyNeed)]
/FLD1)]
"/>
这是一个完整的转型:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vOnlyNeed" select="/*/*[FLD2='N2']"/>
<xsl:variable name="vOnlyNeedDistinct" select=
"$vOnlyNeed
[not(FLD1
=
following::*
[count(.|$vOnlyNeed) = count($vOnlyNeed)]
/FLD1)]
"/>
<xsl:template match="/">
<xsl:copy-of select="$vOnlyNeedDistinct"/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于提供的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>
评估Xpath表达式,并将如此定义的变量$vOnlyNeedDistinct
的内容复制到输出:
<ROW>
<FLD1>P2</FLD1>
<S_VAL>1</S_VAL>
<FLD2>N2</FLD2>
</ROW>
<ROW>
<FLD1>P3</FLD1>
<S_VAL>3</S_VAL>
<FLD2>N2</FLD2>
</ROW>