如何获取属性的值并在条件语句中使用它。例如,我有<O Option="a" LineNr="1">
,这个元素是另一个父元素下的子元素,它与其他元素分组。所以我想要的条件是:如果[value of Option为null],那么[do nothing]else if[check if the value of the attribute under the next parent element with the same value is empty]。例如,如果有3个父元素包含这个具有Option属性的元素,并且所有属性都不为空,那么将它们分组。我已经完成了分组,但它与我现在要使用的这个属性没有连接。所以我只需要条件语句的公式。
编辑:给出所需的输入和输出示例输入示例1:
<Area>
<Type>A</Type>
<Street>
<Position>5</Position>
<House>
<L Option="" LineNr="1">
--> some elements
</L>
</House>
</Street>
<Street>
<Position>5</Position>
<Block>
<O Option="" LineNr="1">
--> some elements
</O>
</Block>
</Street>
<Street>
<Position>6</Position>
<House>
<L Option="o" LineNr="1">
--> some elements
</L>
</House>
</Street>
<Street>
<Position>6</Position>
<Block>
<O Option="" LineNr="1">
--> some elements
</O>
</Block>
</Street>
</Area>
以及所需输出:
<Area>
<Type>A</Type>
<Street>
<Position>5</Position>
<House>
<L Option="" LineNr="1">
--> some elements
</L>
</House>
<Block>
<O Option="" LineNr="1">
--> some elements
</O>
</Block>
</Street>
<Street>
<Position>6</Position>
<House>
<L Option="o" LineNr="1">
--> some elements
</L>
</House>
<Block>
<O Option="" LineNr="1">
--> some elements
</O>
</Block>
</Street>
</Area>
但是,如果在同一个位置编号中,所有引用的Option属性中都有一个值L或O,那么我希望它们排列在位置编号的另一个引用下。比如:
输入示例2:
<Area>
<Type>A</Type>
<Street>
<Position>5</Position>
<House>
<L Option="" LineNr="1">
--> some elements
</L>
</House>
</Street>
<Street>
<Position>5</Position>
<Block>
<O Option="" LineNr="1">
--> some elements
</O>
</Block>
</Street>
<Street>
<Position>6</Position>
<House>
<L Option="o" LineNr="1">
--> some elements
</L>
</House>
</Street>
<Street>
<Position>6</Position>
<Block>
<O Option="a" LineNr="1">
--> some elements
</O>
</Block>
</Street>
</Area>
然后输出为:
<Area>
<Type>A</Type>
<Street>
<Position>5</Position>
<House>
<L Option="" LineNr="1">
--> some elements
</L>
</House>
<Block>
<O Option="" LineNr="1">
--> some elements
</O>
</Block>
<House>
<L Option="o" LineNr="1">
--> some elements
</L>
</House>
<Block>
<O Option="a" LineNr="1">
--> some elements
</O>
</Block>
</Street>
</Area>
因为现在位置6不见了,它的子元素被分组在上出现位置(在这种情况下,在同一类型中是5)下,因为L或O元素中的所有属性Option都有值(如果相关的话,可以是"a"或"O")。
这就是我现在使用的XSLT。它只将相同位置编号的不同出现的元素分组在一个编号下:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="*" />
<xsl:output method="xml" indent="yes" />
<xsl:key name="streetByPosition" match="Street" use="concat(../Type, '|', Position)" />
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>
<!-- for the first Street in each Position -->
<xsl:template match="Street[generate-id() =
generate-id(key('streetByPosition', concat(../Type, '|', Position))[1])]">
<Street>
<!-- copy in the Position element once only -->
<xsl:apply-templates select="Position" />
<!-- copy in all sub-elements except Position from all matching Streets-->
<xsl:apply-templates select="
key('streetByPosition', concat(../Type, '|', Position))/*[not(self::Position)]" />
</Street>
</xsl:template>
<!-- ignore all other Street elements -->
<xsl:template match="Street" />
</xsl:stylesheet>
要通过排序获得所需的结果,可以对节点进行分组,例如:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<Area>
<Type>A</Type>
<xsl:for-each select="/Area/Street">
<xsl:sort select="Position"> </xsl:sort>
<xsl:sort select="node()[name(.)!='Position']"> </xsl:sort>
<xsl:sort select="node()[name(.)!='Position']/node()/@Option"> </xsl:sort>
<xsl:copy-of select="." />
</xsl:for-each>
</Area>
</xsl:template>
</xsl:stylesheet>