当前位置: 首页 > 知识库问答 >
问题:

XSLT:for each group select with condition-not(contains())

满昊然
2023-03-14

我希望在创建xslt转换时获得帮助。我需要从xsl中获得select:for each group with some conditions。我需要获取所有元素,其中子元素“Zkrat”中的文本与该数组中的文本不同

<xsl:variable name="zkratky">
      <zkratka>1</zkratka>
      <zkratka>2</zkratka>
      <zkratka>5</zkratka>
      <zkratka>6</zkratka>
</xsl:variable>

<xsl:variable name="lookup" select="document('')//xsl:variable[@name='zkratky']"/>

我的XML文件输入是:

<MoneyData>
    <SeznamObjPrij>
        <ObjPrij>
            <Polozka>
                <KmKarta>
                    <Popis>Main title</Popis>
                    <TypKarty>komplet</TypKarty>
                    <Slozeni>
                        <Komponenta>
                            <KmKarta>
                                <Popis>Subtitle Item1</Popis>
                                <Zkrat>2</Zkrat>
                                <Katalog>1111</Katalog>
                            </KmKarta>
                            <PocMj>1</PocMj>
                        </Komponenta>
                        <Komponenta>
                            <KmKarta>
                                <Popis>Subtitle Item2</Popis>
                                <Zkrat>1</Zkrat>
                                <Katalog>22222</Katalog>
                            </KmKarta>
                            <PocMj>4</PocMj>
                        </Komponenta>
                        <Komponenta>
                            <KmKarta>
                                <Popis>Subtitle Item3</Popis>
                                <Zkrat>3</Zkrat>
                                <Katalog>1111</Katalog>
                            </KmKarta>
                            <PocMj>1</PocMj>
                        </Komponenta>
                    </Slozeni>
                </KmKarta>
            </Polozka>
            <Polozka>
                <KmKarta>
                    <Popis>Test</Popis>
                    <TypKarty>jednoducha</TypKarty>
                </KmKarta>
            </Polozka>
            <Polozka>
                <KmKarta>
                    <Popis>Main title</Popis>
                    <TypKarty>komplet</TypKarty>
                    <Slozeni>
                        <Komponenta>
                            <KmKarta>
                                <Popis>Subtitle Item1</Popis>
                                <Zkrat>2</Zkrat>
                                <Katalog>1111</Katalog>
                            </KmKarta>
                            <PocMj>10</PocMj>
                        </Komponenta>
                        <Komponenta>
                            <KmKarta>
                                <Popis>Subtitle Item2</Popis>
                                <Zkrat>2</Zkrat>
                                <Katalog>33333</Katalog>
                            </KmKarta>
                            <PocMj>1</PocMj>
                        </Komponenta>
                        <Komponenta>
                            <KmKarta>
                                <Popis>Subtitle Item3</Popis>
                                <Zkrat>1</Zkrat>
                                <Katalog>1111</Katalog>
                            </KmKarta>
                            <PocMj>2</PocMj>
                        </Komponenta>
                        <Komponenta>
                            <KmKarta>
                                <Popis>Subtitle Item4</Popis>
                                <Zkrat>3</Zkrat>
                                <Katalog>4444</Katalog>
                            </KmKarta>
                            <PocMj>1</PocMj>
                        </Komponenta>
                    </Slozeni>
                </KmKarta>
            </Polozka>
        </ObjPrij>
    </SeznamObjPrij>
</MoneyData>

我的xslt转换:

<xsl:for-each-group select="Polozka/KmKarta/Slozeni/Komponenta[$lookup[not(contains(., KmKarta/Zkrat))]]" group-by="KmKarta/Katalog">
       <xsl:sort select="KmKarta/Popis"/>
       <tr>
           <td><xsl:value-of select="KmKarta/Popis"/></td>
           <td><xsl:value-of select="current-grouping-key()"/></td>
           <td><xsl:value-of select="KmKarta/Zkrat"/></td>
           <td><xsl:value-of select="sum(current-group()/PocMJ)"/></td>
       </tr>
</xsl:for-each-group>

我总是得到所有元素或没有。或此消息:匹配所需序列类型的错误出现错误位置:xsl:样式表/xsl:模板/div/table/tbody/xsl:for-achy-group/@选择详细信息XPTY0004:“包含”函数位置“1”处的参数值(“4”项)出现错误以匹配序列类型xs: string(“零或一”)

请帮帮我。非常感谢:)

共有2个答案

陆畅
2023-03-14

我只会用

<xsl:variable name="zkratky">
      <zkratka>1</zkratka>
      <zkratka>2</zkratka>
      <zkratka>5</zkratka>
      <zkratka>6</zkratka>
</xsl:variable>

<xsl:for-each-group select="Polozka/KmKarta/Slozeni/Komponenta[not($zkratky/zkratka = KmKarta/Zkrat)]" group-by="KmKarta/Katalog">
安明亮
2023-03-14

这里有各种各样的错误。

首先,如果您对每个组使用,那么您使用的是XSLT 2.0,这意味着您不需要让样式表使用文档(“”)读取自己的全局变量

这个表达式有几个问题

Komponenta[$lookup[not(contains(., KmKarta/Zkrat))]]

如前所述,用于评估KmKarta/Zkrat的上下文项是$lookup中的一个元素,这不是您想要的。

我认为在这里你不需要contains(),你需要“=”,这使它更简单。

所以我认为你只是想要KomPonenta[not(KmLarta/Zkrat=$zkratky/zkratka)]

 类似资料:
  • 描述 (Description) not( selector )方法从匹配元素集中过滤掉与指定选择器匹配的所有元素。 语法 (Syntax) 以下是使用此方法的简单语法 - <i>selector</i>.not( selector ) 参数 (Parameters) 以下是此方法使用的所有参数的说明 - selector - 它可以是以逗号分隔的选择器列表,一次应用多个过滤器(例如,不是(“。

  • 描述 (Description) java.math.BigInteger.not()返回一个BigInteger,其值为(〜this)。 当且仅当此BigInteger为非负数时,此方法返回负值。 声明 (Declaration) 以下是java.math.BigInteger.not()方法的声明。 public BigInteger not() 参数 (Parameters) NA 返回值

  • 如果集合中值的任何谓词在逻辑上为真,则返回false,否则返回true。 语法 (Syntax) 以下是语法。 (not-any? p1 col) Parameters - 'p1'是需要测试的谓词。 'col'是需要测试的值集合。 Return Value - 如果集合中值的任何谓词在逻辑上为真,则返回false,否则返回true。 例子 (Example) 以下是不是任何一个例子? 在Clo

  • not-perf 由诺基亚开源,是一个用于 Linux 的 CPU 分析工具,类似  perf。 perf最初在嵌入式环境有一些限制,无法进行 CPU 分析,not-perf 因此产生。 特性 支持 AMD64, ARM, AArch64 和 MIPS64 架构 支持离线和在线堆栈追踪的展开 支持在没有调试信息的情况下分析二进制文件 支持 cross-architectural 数据分析 完全与架构无关的数据格式 内置火焰图生成

  • 问题内容: 我有三个表: (Name, grade); (Name, color, grade); (sname,bname,Weekdays, start, end); 为了获得保留每艘红船的水手的清单,我有: 现在,我需要使用NOT IN而不是NOT EXISTS重写此查询。这是我到目前为止的内容: 但是,这将返回已预订红船的所有水手的列表(不一定是全部)。我很难检查列表中的名称是否已保留每条

  • 我有三张桌子: (姓名,等级); (名称、颜色、等级); (sname,bname,工作日,开始,完成);

  • 问题内容: 一个标准的Spring Web应用程序(由Roo或“ Spring MVC Project”模板创建)使用和创建一个。为什么他们不仅使用并使其加载完整的配置? 我知道应该使用来加载与Web不相关的内容,而用于加载与Web相关的内容(控制器等)。这样就产生了两个上下文:父上下文和子上下文。 背景: 我用这种标准方式做了几年了。 这通常会导致两个上下文及其之间的依存关系出现问题。过去,我总

  • 主要内容:示例默认情况下,表的字段可以包含 NULL 值,如果您不希望某个字段出现 NULL 值,那么可以在该字段上添加 NOT NULL 约束(非空约束),此时就必须给该字段指定一个具体的值,不能留空。 注意,NULL 不等于没有数据,而是表示数据是未知的。 示例 下面的 SQL 语句将创建一个名为 website 的新表,该表包含七个字段,其中五个字段不接受 NULL 值,它们分别是 id、name、age