1

输入

 <person>
    <address>
       <city>NY</city>
       <state></state>
       <country>US</country>
    </address>
    <other>
       <gender></gender>
       <age>22</age>
       <weight/>
    </other>
 </person>

我只想从“其他”节点中删除空元素,“其他”下的标签也不固定。

输出

<person>
    <address>
       <city>NY</city>
       <state></state>
       <country>US</country>
    </address>
    <other>
       <age>22</age>
    </other>
 </person>

我是 xslt 的新手,所以请帮忙..

4

2 回答 2

4

这种转变:

<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:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="other/*[not(node())]"/>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<person>
    <address>
        <city>NY</city>
        <state></state>
        <country>US</country>
    </address>
    <other>
        <gender></gender>
        <age>22</age>
        <weight/>
    </other>
</person>

产生想要的正确结果:

<person>
   <address>
      <city>NY</city>
      <state/>
      <country>US</country>
   </address>
   <other>
      <age>22</age>
   </other>
</person>

说明

  1. 身份规则“按原样”复制每个匹配的节点,并为其选择执行。

  2. 唯一覆盖标识模板的模板匹配任何作为其子other节点且没有子节点的元素(为空)。由于这个模板没有正文,这有效地“删除”了匹配的元素。

于 2012-11-12T13:09:20.623 回答
1
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml"/>
    <xsl:template match="/">
        <xsl:apply-templates select="person"/>
    </xsl:template>
    <xsl:template match="person">
        <person>
            <xsl:copy-of select="address"/>
            <xsl:apply-templates select="other"/>
        </person>
    </xsl:template>
    <xsl:template match="other">
        <xsl:for-each select="child::*">
            <xsl:if test=".!=''">
                <xsl:copy-of select="."/>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
于 2012-11-13T16:12:06.053 回答