首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT排序顺序以匹配不同父节点的顺序

XSLT排序顺序以匹配不同父节点的顺序
EN

Stack Overflow用户
提问于 2015-06-10 16:52:51
回答 2查看 101关注 0票数 0

顺便说一句,我有两个节点共享其数据的子集。我需要根据第二组的原始顺序对第一组进行排序。

为了给出一个例子,请考虑以下几组点和线。每一行的“开始”和“结束”点在每一种情况下都会被列在点数列表中。

代码语言:javascript
复制
<Points>
    <Point name="Point1">0 0</Point>
    <Point name="Point2">0 1</Point>
    <Point name="Point3">1 1</Point>
    <Point name="Point4">1 0</Point>
</Points>

<Shape>
    <Line name="Line1">
        <Start>0 0</Start>
        <End>0 1</End>
    </Line>
    <Line name="Line2">
        <Start>0 1</Start>
        <End>1 1</End>
    </Line>
    <Line name="Line3">
        <Start>1 1</Start>
        <End>1 0</End>
    </Line>
    <Line name="Line4">
        <Start>1 0</Start>
        <End>0 0</End>
    </Line>
</Shape>

我需要排序点,使值匹配相同的顺序,为形状列出的端点。

对于上面的示例,预期的XSLT输出如下..。

代码语言:javascript
复制
Point2 0 1
Point3 1 1
Point4 1 0
Point1 0 0

具体来说,我正在使用来自AutoCAD的COGO点和对齐对象,试图基于来自Civil3D的LandXML输出定制报告。上面的样品只是为了给我一些方向。任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-10 17:04:12

我认为这应该有效:一个匹配End节点并以相同文本值获取Point节点的模板(还有第二个模板匹配所有text(),以确保它不会无意中被输出):

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

    <xsl:template match="/root/Shape/Line/End">
        <xsl:variable name="endPtText" select="./text()" />
        <xsl:value-of select="/root/Points/Point[text() = $endPtText]/@name" /><xsl:text> </xsl:text><xsl:value-of select="$endPtText"/> <xsl:text>
</xsl:text>
    </xsl:template>

    <xsl:template match="text()" />
</xsl:transform>

生产:

代码语言:javascript
复制
Point2 0 1
Point3 1 1
Point4 1 0
Point1 0 0

发自:

代码语言:javascript
复制
<root>
  <Points>
    <Point name="Point1">0 0</Point>
    <Point name="Point2">0 1</Point>
    <Point name="Point3">1 1</Point>
    <Point name="Point4">1 0</Point>
  </Points>

  <Shape>
    <Line name="Line1">
        <Start>0 0</Start>
        <End>0 1</End>
    </Line>
    <Line name="Line2">
        <Start>0 1</Start>
        <End>1 1</End>
    </Line>
    <Line name="Line3">
        <Start>1 1</Start>
        <End>1 0</End>
    </Line>
    <Line name="Line4">
        <Start>1 0</Start>
        <End>0 0</End>
    </Line>
  </Shape>
</root>        

XSLTransform

只需注意,如果您有两个相同的Point文本节点,这将无法工作,如果您没有对应于End节点的Point节点,则不会工作。

票数 0
EN

Stack Overflow用户

发布于 2015-06-10 17:14:58

总有相同数目的点数作为结束。

在这种情况下,问题可重述如下:

按文档顺序列出所有结束点,以及相应的点名。

实现这一目标的最佳方法是使用钥匙 --例如(简化为说明原理):

XSLT1.0

代码语言:javascript
复制
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="pt" match="Point" use="." />

<xsl:template match="/root">
    <xsl:copy>
        <xsl:for-each select="Shape/Line">
            <xsl:copy-of select="key('pt', End)"/>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

结果:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <Point name="Point2">0 1</Point>
  <Point name="Point3">1 1</Point>
  <Point name="Point4">1 0</Point>
  <Point name="Point1">0 0</Point>
</root>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30762608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档