Я боролся с выбором правильного узла из массива идентичных узлов на основе приоритета.
Это XML:
<?xml version="1.0" encoding="UTF-8"?>
<LandXML>
<CgPoints>
<CgPoint name="name1" oID="id1"></CgPoint>
<CgPoint name="name2" oID="id2"></CgPoint>
<CgPoint name="name3" oID="id1"></CgPoint>
<CgPoint name="name4" oID="id1"></CgPoint>
<CgPoint name="name5" oID="id2"></CgPoint>
<CgPoint name="name6" oID="id3"></CgPoint>
</CgPoints>
<Points>
<Point uniqueID="name1" class="medium" text="text1"></Point>
<Point uniqueID="name2" class="medium" text="text2"></Point>
<Point uniqueID="name3" class="high" text="text3"></Point>
<Point uniqueID="name4" class="low" text="text4"></Point>
<Point uniqueID="name5" class="low" text="text5"></Point>
<Point uniqueID="name6" class="medium" text="text6"></Point>
</Points>
</LandXML>
Что я хочу сделать, так этоПройдите через элемент CgPoints
и получите все имена oID
из узлов, а если идентичные имена oID
совпадают, выберите только одно с самым высоким атрибутом class
в элементе Points
.После этого я хочу добавить атрибут text
к извлеченным oID
именам.
Вывод будет выглядеть следующим образом:
id1,text3, <!-- this is the node with `name` attribute value `name3` -->
id2,text2,
id3,text6, <!-- this is the node with `name` attribute value `name2` -->
Это xslt, который я придумална данный момент:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
<xsl:output method="text" indent="no" encoding="utf-8"/>
<xsl:variable name="fileExt" select="'txt'"/>
<!-- Comma separator -->
<xsl:variable name="separator" select="','"/>
<xsl:key name="keyHPoint" match="/LandXML/Points/Point" use="@uniqueID"/>
<xsl:template match="/">
<xsl:apply-templates select="/LandXML/CgPoints/CgPoint">
</xsl:apply-templates>
</xsl:template>
<xsl:template match="/LandXML/CgPoints/CgPoint">
<xsl:variable name="name" select="./@name"/>
<xsl:variable name="id" select="./@oID"/>
<xsl:variable name="allpoints" select="/LandXML/CgPoints/CgPoint[@oID = $id]"/>
<xsl:variable name="Point1" select="key('keyHPoint', $allpoints/@oID)"/>
<xsl:choose>
<xsl:when test="count($allpoints) = 1">
<xsl:value-of select="concat($id, $separator)"/>
<xsl:apply-templates select="/LandXML/Points/Point[@uniqueID = $name]"/>
<xsl:call-template name="newline">
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="$Point1[@class = 'high']">
<xsl:value-of select="concat($id, $separator)"/>
<xsl:apply-templates select="/LandXML/Points/Point[@uniqueID = $name]"/>
<xsl:call-template name="newline">
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="$Point1[@class = 'medium']">
<xsl:value-of select="concat($id, $separator)"/>
<xsl:apply-templates select="/LandXML/Points/Point[@uniqueID = $numurs]"/>
<xsl:call-template name="newline">
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="$Point1[@class = 'low']">
<xsl:value-of select="concat($id, $separator)"/>
<xsl:apply-templates select="/LandXML/Points/h:Point[@uniqueID = $name]"/>
<xsl:call-template name="newline">
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Text template -->
<xsl:template match="/LandXML/Points/Point">
<xsl:value-of select="concat(./@text, $separator)"/>
</xsl:template>
<!-- New line -->
<xsl:template name="newline">
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
С этим xslt я получаю вывод со всеми узлами, выбор по приоритету не применяется.Заранее спасибо за любую помощь!