Xslt 扭曲的前兄弟姐妹

Xslt 扭曲的前兄弟姐妹,xslt,Xslt,在示例XML中,有两种形式在数量和类型上匹配;在第二个匹配表单中,我需要清空标志元素的值。由于一些相互关联的样式表,我无法更改迭代的级别。如果我在formslist上迭代,我可以执行前面的同级,但是当我在标记元素上更深一层时,我似乎无法获得正确的语法。数字和类型必须匹配才能将其删除 <apply-templates match="formslist/flag"> <xsl:choose> <xsl:when test=""></xsl:whe

在示例XML中,有两种形式在数量和类型上匹配;在第二个匹配表单中,我需要清空
标志
元素的值。由于一些相互关联的样式表,我无法更改迭代的级别。如果我在
formslist
上迭代,我可以执行
前面的同级
,但是当我在
标记
元素上更深一层时,我似乎无法获得正确的语法。数字和类型必须匹配才能将其删除

<apply-templates match="formslist/flag">  
<xsl:choose>
    <xsl:when test=""></xsl:when>
</xsl:choose>
</apply-templates>

示例XML

<forms>
    <formslist>
        <number>one</number>
        <type>car</type>
        <flag>da</flag>
    </formslist>
    <formslist>
        <number>two</number>
        <type>truck</type>
        <flag>ex</flag>
    </formslist>
    <formslist>
        <number>one</number>
        <type>car</type>
        <flag>da</flag>
    </formslist>
</forms>

一
汽车
da
二
卡车
前任
一
汽车
da

当在模板内对
标志匹配进行评估时,这应该可以完成您想要的:

    <xsl:variable name="thisFormslist" select=".." />
    <flag>
        <xsl:choose>
            <xsl:when test="../preceding-sibling::*[$thisFormslist/number=number and $thisFormslist/type=type]">
                <!--number and type have been seen before, so don't put a value for this flag-->
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="."/>
            </xsl:otherwise>
        </xsl:choose>
    </flag>


它创建一个变量来引用当前的
formslist
元素,然后在谓词过滤器中使用该变量将
数字和
类型
与父元素(
formslist
)的
前面的同级元素(
formslist
)进行比较

<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:key name="kFlag" match="formslist/flag"
  use="concat(../number, '+', ../type)"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match=
 "flag/text()[generate-id(..)
           !=
            generate-id(key('kFlag',
                            concat(../../number,
                                   '+',
                                   ../../type
                                   )
                            )[1]
                        )
            ]
 "/>
</xsl:stylesheet>
<forms>
    <formslist>
        <number>one</number>
        <type>car</type>
        <flag>da</flag>
    </formslist>
    <formslist>
        <number>two</number>
        <type>truck</type>
        <flag>ex</flag>
    </formslist>
    <formslist>
        <number>one</number>
        <type>car</type>
        <flag>da</flag>
    </formslist>
</forms>
<forms>
   <formslist>
      <number>one</number>
      <type>car</type>
      <flag>da</flag>
   </formslist> 
   <formslist>
      <number>two</number>
      <type>truck</type>
      <flag>ex</flag>
   </formslist>
   <formslist>
      <number>one</number>
      <type>car</type>
      <flag/>
   </formslist>
</forms>

应用于提供的XML文档时

<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:key name="kFlag" match="formslist/flag"
  use="concat(../number, '+', ../type)"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match=
 "flag/text()[generate-id(..)
           !=
            generate-id(key('kFlag',
                            concat(../../number,
                                   '+',
                                   ../../type
                                   )
                            )[1]
                        )
            ]
 "/>
</xsl:stylesheet>
<forms>
    <formslist>
        <number>one</number>
        <type>car</type>
        <flag>da</flag>
    </formslist>
    <formslist>
        <number>two</number>
        <type>truck</type>
        <flag>ex</flag>
    </formslist>
    <formslist>
        <number>one</number>
        <type>car</type>
        <flag>da</flag>
    </formslist>
</forms>
<forms>
   <formslist>
      <number>one</number>
      <type>car</type>
      <flag>da</flag>
   </formslist> 
   <formslist>
      <number>two</number>
      <type>truck</type>
      <flag>ex</flag>
   </formslist>
   <formslist>
      <number>one</number>
      <type>car</type>
      <flag/>
   </formslist>
</forms>

一
汽车
da
二
卡车
前任
一
汽车
da
生成所需的正确结果

<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:key name="kFlag" match="formslist/flag"
  use="concat(../number, '+', ../type)"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match=
 "flag/text()[generate-id(..)
           !=
            generate-id(key('kFlag',
                            concat(../../number,
                                   '+',
                                   ../../type
                                   )
                            )[1]
                        )
            ]
 "/>
</xsl:stylesheet>
<forms>
    <formslist>
        <number>one</number>
        <type>car</type>
        <flag>da</flag>
    </formslist>
    <formslist>
        <number>two</number>
        <type>truck</type>
        <flag>ex</flag>
    </formslist>
    <formslist>
        <number>one</number>
        <type>car</type>
        <flag>da</flag>
    </formslist>
</forms>
<forms>
   <formslist>
      <number>one</number>
      <type>car</type>
      <flag>da</flag>
   </formslist> 
   <formslist>
      <number>two</number>
      <type>truck</type>
      <flag>ex</flag>
   </formslist>
   <formslist>
      <number>one</number>
      <type>car</type>
      <flag/>
   </formslist>
</forms>

一
汽车
da
二
卡车
前任
一
汽车

请注意使用Muenchian方法进行分组,这比使用前面的兄弟姐妹进行比较要快得多:*
(最后一个兄弟姐妹有一个
O(N^2)
——二次性能)。

您的问题有点让人困惑。如果要获取当前
标志的
窗体列表
父级
,应使用
。“
。为了得到更好的答案,您需要提供所需的输出和完整的样式表。请参阅我的答案,以获得完整有效的解决方案。