我的问题是如何使用 XSLT 进行以下转换?
这种转变满足了所有三个要求:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kND-By-Ref" match="way/nd" use="@ref"/>
<xsl:key name="kNodeById" match="node" use="@id"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="node[not(key('kND-By-Ref', @id))]"/>
<xsl:template match="way[nd[not(key('kNodeById', @ref))]]"/>
<xsl:template match="node[not(tag)]/@visible">
<xsl:attribute name="visible">false</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
当应用于此 XML 文档时(适合创建以包含每个需求的案例):
<osm version="0.6" generator="CGImap 0.0.2">
<node id="1726631203" lat="50.8500083" lon="4.3553223" visible="true"
version="6" changeset="9938190" timestamp="2011-11-24T22:05:32Z">
<tag/>
</node>
<node id="1726631223" lat="50.8500083" lon="4.3553223" visible="true"
version="6" changeset="9938190" timestamp="2011-11-24T22:05:32Z"/>
<node id="ZZZZZZZ" lat="50.8500083" lon="4.3553223" visible="true"
version="6" changeset="9938190" timestamp="2011-11-24T22:05:32Z"/>
<way id="160611697" user="toSc" uid="246723" visible="true"
version="1" changeset="11385198" timestamp="2012-04-22T14:57:19Z">
<nd ref="1726631203"/>
<nd ref="1726631223"/>
</way>
<way id="160611698" user="toSc" uid="246723" visible="true"
version="1" changeset="11385198" timestamp="2012-04-22T14:57:19Z">
<nd ref="1726631203"/>
<nd ref="1726631223"/>
<nd ref="1726631213"/>
<nd ref="1726631205"/>
<nd ref="1726631185"/>
<nd ref="1726631203"/>
</way>
</osm>
产生所需的正确结果(执行所有过滤并将其中一个元素的visible
属性转换为):node
false
<osm version="0.6" generator="CGImap 0.0.2">
<node id="1726631203" lat="50.8500083" lon="4.3553223"
visible="true" version="6" changeset="9938190" timestamp="2011-11-24T22:05:32Z">
<tag/>
</node>
<node id="1726631223" lat="50.8500083" lon="4.3553223"
visible="false" version="6" changeset="9938190" timestamp="2011-11-24T22:05:32Z"/>
<way id="160611697" user="toSc" uid="246723" visible="true"
version="1" changeset="11385198" timestamp="2012-04-22T14:57:19Z">
<nd ref="1726631203"/>
<nd ref="1726631223"/>
</way>
</osm>
说明:
身份规则被三个模板覆盖,每个模板实现三个要求之一。
具有空主体的两个覆盖模板实现了两个过滤要求。
我们使用键来方便有效地通过属性查找s,并通过属性node
查找s 。id
nd
ref
属性值替换要求在第三个覆盖模板中实现。