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. ID テンプレートをオーバーライドする唯一のテンプレートは、の子であり、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 に答える