4

xslt を使用して特定の XML を変換しようとしています。注意点は、特定の子ノードが存在しない場合、親ノードを削除する必要があることです。テンプレート マッチングを行いましたが、行き詰まっています。どんな助けでも大歓迎です。

入力 xml :

   <Cars>
      <Car>
        <Brand>Nisan</Brand>
        <Price>12</Price>
     </Car>
     <Car>
        <Brand>Lawrence</Brand>
     </Car>
     <Car>
       <Brand>Cinrace</Brand>
       <Price>14</Price>
     </Car>
   </Cars>

価格要素が含まれていない車を削除したいと思います。したがって、期待される出力は次のとおりです。

 <Cars>
      <Car>
        <Brand>Nisan</Brand>
        <Price>12</Price>
     </Car>
     <Car>
       <Brand>Cinrace</Brand>
       <Price>14</Price>
     </Car>
   </Cars>

私はこれを使ってみました:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" />
 <xsl:output omit-xml-declaration="yes"/>

    <xsl:template match="node()|@*">
      <xsl:copy>
         <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>
<xsl:template match="Cars/Car[contains(Price)='false']"/>
</xsl:stylesheet>

XSLT が完全に間違っていることは承知しています。アドバイスをお願いします。

アップデート

動作するものを修正しました:)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <!--Identity template to copy all content by default-->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>


    <xsl:template match="Car[not(Price)]"/>

</xsl:stylesheet>
4

3 に答える 3

2

超近い。最後のテンプレートを次のように変更するだけです。

<xsl:template match="Car[not(Price)]"/>

xsl:outputまた、それは間違っていませんが、2 つの要素を組み合わせることができます。

<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
于 2013-02-08T18:38:23.180 に答える
0

別の解決策は、'xsl:copy-of' 要素を使用することです。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output method="xml" />

    <xsl:template match="Cars">
        <xsl:copy>
            <xsl:copy-of select="Car[Price]" />
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>
于 2013-02-08T19:20:11.093 に答える
0
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <!--Identity template to copy all content by default-->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>


    <xsl:template match="Car[not(Price)]"/>

</xsl:stylesheet>
于 2013-02-08T18:38:42.607 に答える