我有这样的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_need”


实际上,这是一个纯粹的XPath问题。

可以避免使用键,而仅使用诸如“ preced”或“ following”之类的轴来查找“不同”元素,但是请记住,这非常慢-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>

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

10-10 10:06