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
Xml 对属性中的数据进行排序和重复数据消除_Xml_Xslt_Xpath - Fatal编程技术网

Xml 对属性中的数据进行排序和重复数据消除

Xml 对属性中的数据进行排序和重复数据消除,xml,xslt,xpath,Xml,Xslt,Xpath,每个记录行程的航段。行程按文件顺序记录。有些腿在同一个地方开始和结束(例如,从MA到MA),有些腿在不同的地方开始和结束(例如,从MA到CT)。缺少有关开始和结束位置的某些数据 <trip> <leg start="MA" stop="MA" /> <leg start="MA" stop="CT" /> <leg start="NY" /> <leg />

每个
记录行程的航段。行程按文件顺序记录。有些腿在同一个地方开始和结束(例如,从MA到MA),有些腿在不同的地方开始和结束(例如,从MA到CT)。缺少有关开始和结束位置的某些数据

<trip>
  <leg start="MA" stop="MA" />
  <leg start="MA" stop="CT" /> 
  <leg start="NY"           />
  <leg                      />
  <leg start="DE"           />
  <leg            stop="DE" />
  <leg start="NY" stop="PA" />
</trip>

使用XSLT/XPATH 1.0,我想要一个位置列表,按访问顺序排列:

<trip>
  <place>MA</place>
  <place>CT</place>
  <place>NY</place>
  <place>DE</place>
  <place>NY</place>
  <place>PA</place>
</trip>

文科硕士
计算机断层扫描
纽约
判定元件
纽约
帕
编辑:

好的,我想我知道怎么做了:

<xsl:template match="leg" mode="tour">
    <xsl:if test="string(@start)">
        <place><xsl:value-of select="@start"></place>
    </xsl:if>
    <xsl:if test="string(@end)">
        <place><xsl:value-of select="@end"></place>
    </xsl:if>
</xsl:template>


<xsl:variable name="rtfPlaces">
    <xsl:apply-templates select="trip/leg" mode="tour" />
</xsl:variable>

<xsl:variable name="places" select="exslt:node-set($rtfPlaces)" />

<xsl:variable name="uniquePlaces" select="$places/place[1] | $places/place[.!=preceding-sibling::place[1]]" /> 

解决方案:确实要分两次处理。分别写出所需顺序的@start和@end。然后在第二遍选择唯一值

这并没有让我得到输出中的
trip
元素,但我认为我真的不需要它

它确实需要节点集扩展,但也可以


如果这一切都能一次完成,我不知道怎么办。

这应该能一次完成

XML输入

<trip>
  <leg start="MA" stop="MA" />
  <leg start="MA" stop="CT" />
  <leg start="NY"           />
  <leg                      />
  <leg start="DE"           />
  <leg            stop="DE" />
  <leg start="NY" stop="PA" />
</trip>
<trip>
   <place>MA</place>
   <place>CT</place>
   <place>NY</place>
   <place>DE</place>
   <place>NY</place>
   <place>PA</place>
</trip>

多好啊。。。你有什么问题想问吗?这不是一个“为我写这段代码”的网站,而是“这是我尝试过的,有什么问题吗?”当我没有让别人经历我的个人失误时,我通常会得到比我自己更友好的回复。我对你的冒犯表示歉意。在这一点上,我不知道从哪里开始。我想我应该先序列化,然后进行重复数据消除,但由于属性不是按文档顺序处理的,所以如何按顺序交错开始和停止?虽然我对此有些挠头,但我还是觉得即使是先序列化也是正确的策略。我会继续游荡,回头看看是否有人向一个迷失的灵魂提供了帮助,并在我出现编码错误时编辑帖子。这样更好。谢谢在我学习XSLT的过程中,我还没有想到要像您那样使用XSLT优先级设置器来覆盖start=stop。这对我来说是一个很好的教训+1,Q回答。(如果您想提高原始Q值,请这样做。)
<trip>
   <place>MA</place>
   <place>CT</place>
   <place>NY</place>
   <place>DE</place>
   <place>NY</place>
   <place>PA</place>
</trip>
  <xsl:template match="leg">
    <xsl:apply-templates select="@start"/>
    <xsl:apply-templates select="@stop"/>
  </xsl:template>