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>