xslt - xsl "following"返回的不是预期的结果

标签 xslt xpath

我有这样的 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()] )]" />

我在这里所做的是定义一个键,该键将从 FLD2N2 的行中提取所有 FLD1 元素并将它们分组通过其 FLD1 值。变量声明中的谓词使用此键仅选择每个组中的最后一个元素。

关于xslt - xsl "following"返回的不是预期的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12636539/

相关文章:

XML/XSL 结点 : Is it possible to create a COMPOSITE XML/XSLT document?

.net - 在xslt,.net中为应用模板选择传递参数

c# - XPath matches() 在 C# 中使用正则表达式

php - 我可以使用 SimpleXML 和 Xpath 直接选择元素属性吗?

java - 如何使 javax Transformer 输出 HTML(无自闭标签)?

java - 如何在 Java Web 应用程序中嵌入 DocBook XSLT 转换?

xslt - XSLT 中的主样式表共享

xml - XPath 选择节点直到条件

xml - 来自带有命名空间前缀的 xml 的 xpath 表达式

php - Xpath反向搜索