XSLT 1.0-<xsl:if =“” test =“” .. =“”>条件后的冗余节点

时间:2019-03-21 11:43:09

标签: xml xslt xpath

我有一个xslt文件,如下所示;

<xsl:if test="/ItemList/Item/cx">
            <kml:Circle>

           </kml:Circle>

</xsl:if>
<xsl:if test="/ItemList/Item/Lon">
            <kml:Point>

          </kml:Point>

</xsl:if>

在如下所示的xml文件上执行xslt后,它会生成冗余标签,例如<kml:Point/><kml:Circle/>。但是我不想要这个标签。

示例XML文件

<ItemList>
  <Item>
    <Name>1</Name>
    <Lon>66.406180329538</Lon>
    <Lat>35.7185924672465</Lat>

  </Item>
  <Item>
    <Name>2</Name>
    <cx>1</cx>
    <cy>2</cy>
    <rx>3</rx>
    <ry>4</ry>
  </Item>
</ItemList> 

在此文件上执行xslt之后,示例输出如下所示;

<kml:Placemark>
<kml:Circle cx="1" cy="2" r="3"/>
<kml:Point/>
</kml:Placemark>

<kml:Placemark>
<kml:Circle/>
<kml:Point>
<kml:coordinates>68.406180329538,35.7185924672465</kml:coordinates>
</kml:Point>
</kml:Placemark>

我的问题是,执行此xslt后,为什么会有像<kml:Point/><kml:Circle/>这样的节点。我不要这个多余的节点。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

此XPath表达式/ItemList/Item/cxabsolute location path,它不依赖于与您的转换规则匹配的上下文节点。简而言之,它将始终选择相同的节点,因此它将始终具有相同的布尔值。

因为您的输入文档同时具有cxLon元素(在不同分支中,但它们都存在),因此您的xsl:if指令内容将得到处理。