Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript XSLT节点,选择组中的第一个(类似合并)_Xslt_Grouping_Nodes - Fatal编程技术网

javascript XSLT节点,选择组中的第一个(类似合并)

javascript XSLT节点,选择组中的第一个(类似合并),xslt,grouping,nodes,Xslt,Grouping,Nodes,在阅读了这里的一些合并帖子后,我的问题似乎更简单了,我无法找到答案。所以我提出了一个新问题 原始xml <data> <proteins> <protein> <accession>111</accession> </protein> </proteins> <peptides> <peptide> <accession>111</accession> <

在阅读了这里的一些合并帖子后,我的问题似乎更简单了,我无法找到答案。所以我提出了一个新问题

原始xml

<data>

<proteins>
<protein>
<accession>111</accession>
</protein>
</proteins>

<peptides>
<peptide>
<accession>111</accession>
<sequence>AAA</sequence>
</peptide>
<peptide>
<accession>111</accession>
<sequence>AAA</sequence>
</peptide>
<peptide>
<accession>111</accession>
<sequence>AAA</sequence>
</peptide>
<peptide>
<accession>111</accession>
<sequence>BBB</sequence>
</peptide>
<peptide>
<accession>111</accession>
<sequence>BBB</sequence>
</peptide>
<peptide>
<accession>111</accession>
<sequence>BBB</sequence>
</peptide>
<peptide>
<accession>111</accession>
<sequence>BBB</sequence>
</peptide>
</peptides>

</data>

111
111
AAA
111
AAA
111
AAA
111
BBB
111
BBB
111
BBB
111
BBB
xslt,用作浏览器解释的.xsl页面

<xsl:template match="/">
<xsl:apply-templates select="/data/proteins/protein" />
</xsl:template>

<xsl:template match="/data/proteins/protein">
<xsl:apply-templates select="/data/peptides/peptide[accession = current()/accession]" >
</xsl:template>

<xsl:template match="/data/peptides/peptide">
...
</xsl:template>

...
我得到的输出(概念上,因为这是一个更大代码的简化)


111
AAA
111
AAA
111
AAA
111
BBB
111
BBB
111
BBB
111
BBB
以及我想要的输出,即每个序列只有一个条目,以避免重复

<peptide>
<accession>111</accession>
<sequence>AAA</sequence>
</peptide>
<peptide>
<accession>111</accession>
<sequence>BBB</sequence>
</peptide>

111
AAA
111
BBB
我很乐意只使用共享相同序列的第一个节点(因此不合并它们)。 欢迎任何帮助:)


谢谢

样式表缺少的是识别一组相同项目中第一个项目的方法。以下样式表使用
xsl:key
元素通过其
加入
序列
值的组合进行分组:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:key name="byAccSeq" match="peptide" 
                             use="concat(accession, '|', sequence)"/>
    <xsl:template match="/">
        <root><xsl:apply-templates select="/*/proteins/protein"/></root>
    </xsl:template>
    <xsl:template match="protein">
        <xsl:apply-templates
            select="../../peptides/peptide[accession=current()/accession]"/>
    </xsl:template>
    <xsl:template match="peptide[generate-id()=
             generate-id(key('byAccSeq', concat(accession, '|', sequence))[1])]">
        <xsl:copy-of select="."/>
    </xsl:template>
    <xsl:template match="peptide"/>
</xsl:stylesheet>
为了匹配为某个键返回的节点列表中的第一个元素,我们使用以下模板/模式:

<xsl:template match="peptide[generate-id()=
               generate-id(key('byAccSeq', concat(., accession, sequence))[1])]">
这种分组技术称为Muenchian方法。进一步阅读:

备选方案(仅一个模板和一条指令):


将此转换应用于提供的XML文档时

<data>
    <proteins>
        <protein>
            <accession>111</accession>
        </protein>
    </proteins>
    <peptides>
        <peptide>
            <accession>111</accession>
            <sequence>AAA</sequence>
        </peptide>
        <peptide>
            <accession>111</accession>
            <sequence>AAA</sequence>
        </peptide>
        <peptide>
            <accession>111</accession>
            <sequence>AAA</sequence>
        </peptide>
        <peptide>
            <accession>111</accession>
            <sequence>BBB</sequence>
        </peptide>
        <peptide>
            <accession>111</accession>
            <sequence>BBB</sequence>
        </peptide>
        <peptide>
            <accession>111</accession>
            <sequence>BBB</sequence>
        </peptide>
        <peptide>
            <accession>111</accession>
            <sequence>BBB</sequence>
        </peptide>
    </peptides>
</data>
<peptide>
   <accession>111</accession>
   <sequence>AAA</sequence>
</peptide>
<peptide>
   <accession>111</accession>
   <sequence>BBB</sequence>
</peptide>

111
111
AAA
111
AAA
111
AAA
111
BBB
111
BBB
111
BBB
111
BBB
生成所需的正确结果

<data>
    <proteins>
        <protein>
            <accession>111</accession>
        </protein>
    </proteins>
    <peptides>
        <peptide>
            <accession>111</accession>
            <sequence>AAA</sequence>
        </peptide>
        <peptide>
            <accession>111</accession>
            <sequence>AAA</sequence>
        </peptide>
        <peptide>
            <accession>111</accession>
            <sequence>AAA</sequence>
        </peptide>
        <peptide>
            <accession>111</accession>
            <sequence>BBB</sequence>
        </peptide>
        <peptide>
            <accession>111</accession>
            <sequence>BBB</sequence>
        </peptide>
        <peptide>
            <accession>111</accession>
            <sequence>BBB</sequence>
        </peptide>
        <peptide>
            <accession>111</accession>
            <sequence>BBB</sequence>
        </peptide>
    </peptides>
</data>
<peptide>
   <accession>111</accession>
   <sequence>AAA</sequence>
</peptide>
<peptide>
   <accession>111</accession>
   <sequence>BBB</sequence>
</peptide>

111
AAA
111
BBB

解释:Muenchian分组,其中键值是两个元素的值的组合。

/data/peptides/peptides[accession=current()/accession]
不是有效的XPath表达式。请修复您的源代码并澄清您的问题。您能告诉我一些文档,其中解释了为什么不是有效的XPath表达式吗?老实说,我不知道。关于问题的澄清,发布了原始xml和所需的xml,其他信息可能是多余的,但缺少什么信息?@PointedEars-你为什么这么认为?询问任何XPath处理器,如
document。评估(“/data/peptides/peptides[accession=current()/accession]”,document,null,0,null)
在(非基于MSHTML的)浏览器的脚本控制台中。读一读这本书;无法使用PredicateExpr生成
[
..
]
之间的部分。您的XSLT处理器(哪一个?)也应该能够显示错误消息。@PointedEars:您所引用的XPath表达式在XSLT转换中使用时是正确的。我仍然不知道
。/../peptides/peptides[accession=current()/accession]
如何成为有效的XPath表达式,但这可能是特定于XSLT的。如果是,请解释。哪一部分困扰着你?它是当前的吗??这是一个XSLT函数,它返回一个仅包含模板当前正在处理的节点的节点集。请参见此处:我们正在选择所有
元素,这些元素的子元素名为
加入
,其值等于当前节点的
加入
元素的值。谢谢,我现在理解了。除了还不需要
current()
之外,我还没有看到
access
等同于
access/text()
,它必须在一个EqualityExpr中。@PointedEars-规范中的这两个引号应该解释:1)如果要比较的两个对象都是节点集,则当且仅当第一个节点集中有一个节点,第二个节点集中有一个节点,并且对这两个节点的字符串值执行比较的结果为真时,比较才会为真。2元素节点的字符串值是元素节点的所有文本节点子体的字符串值按文档顺序的串联。“在这种情况下,我需要对属于一个加入的所有肽进行分组,并在所有肽中按顺序对它们进行分组,并且只显示该组中的一个。根据你的解决方案,我无法进行我所能看到的第一次过滤。但这让我认为我可以通过加入和加入以及序列对肽进行分组,并对这两个组的每一个进行分析。我看不出这是否比执行apply template调用更有效,但如果是这样的话,我会转向这个解决方案。谢谢@杰拉德:这个解决方案产生的结果正是你问题中想要的结果。现在在你的评论中,你提出了我第一次看到的新要求。请理解,你现在的问题已经完全回答了——有两个正确答案,我的答案更简短。在这一点上,你有两个选择:接受你认为最好的答案,然后发布一个新的SO问题,说明你的新要求。或者,您可以使用新的要求编辑当前的问题。在这两个可能的选择中,我强烈建议使用第一个。明白了,我没有看到任何带有“接受”的按钮,所以我知道它在这里结束。我会听从你的建议,谢谢:)
<xsl:template match="peptide"/>
<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="kPepByAccAndSeq" match="peptide"
  use="concat(accession, '+', sequence)"/>

 <xsl:template match="/">
   <xsl:copy-of select=
    "/*/peptides
          /peptide
              [generate-id()
              =
               generate-id(key('kPepByAccAndSeq',
                               concat(accession, '+', sequence)
                              )[1]
                          )
              ]
    "/>
 </xsl:template>
</xsl:stylesheet>
<data>
    <proteins>
        <protein>
            <accession>111</accession>
        </protein>
    </proteins>
    <peptides>
        <peptide>
            <accession>111</accession>
            <sequence>AAA</sequence>
        </peptide>
        <peptide>
            <accession>111</accession>
            <sequence>AAA</sequence>
        </peptide>
        <peptide>
            <accession>111</accession>
            <sequence>AAA</sequence>
        </peptide>
        <peptide>
            <accession>111</accession>
            <sequence>BBB</sequence>
        </peptide>
        <peptide>
            <accession>111</accession>
            <sequence>BBB</sequence>
        </peptide>
        <peptide>
            <accession>111</accession>
            <sequence>BBB</sequence>
        </peptide>
        <peptide>
            <accession>111</accession>
            <sequence>BBB</sequence>
        </peptide>
    </peptides>
</data>
<peptide>
   <accession>111</accession>
   <sequence>AAA</sequence>
</peptide>
<peptide>
   <accession>111</accession>
   <sequence>BBB</sequence>
</peptide>