顺便说一句,我有两个节点共享其数据的子集。我需要根据第二组的原始顺序对第一组进行排序。
为了给出一个例子,请考虑以下几组点和线。每一行的“开始”和“结束”点在每一种情况下都会被列在点数列表中。
<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输出如下..。
Point2 0 1
Point3 1 1
Point4 1 0
Point1 0 0具体来说,我正在使用来自AutoCAD的COGO点和对齐对象,试图基于来自Civil3D的LandXML输出定制报告。上面的样品只是为了给我一些方向。任何帮助都将不胜感激。
发布于 2015-06-10 17:04:12
我认为这应该有效:一个匹配End节点并以相同文本值获取Point节点的模板(还有第二个模板匹配所有text(),以确保它不会无意中被输出):
<?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>生产:
Point2 0 1
Point3 1 1
Point4 1 0
Point1 0 0发自:
<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节点,则不会工作。
发布于 2015-06-10 17:14:58
总有相同数目的点数作为结束。
在这种情况下,问题可重述如下:
按文档顺序列出所有结束点,以及相应的点名。
实现这一目标的最佳方法是使用钥匙 --例如(简化为说明原理):
XSLT1.0
<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>结果:
<?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>https://stackoverflow.com/questions/30762608
复制相似问题