0

Property1 と SubProperty2 を選択し、その他のプロパティを取り除く必要があります。xml に追加された新しいプロパティが検証を破らないように、この将来の証拠を作成する必要があります。iow の新しいフィールドは、デフォルトで削除する必要があります。

<Root>
    <Property1/>
    <Property2/>
    <Thing>
        <SubProperty1/>
        <SubProperty2/>
    </Thing>
    <VariousProperties/>
</Root>

だから私のxsltで私はこれをしました:

  <xsl:template match="Property1">
     <Property1>
       <xsl:apply-templates/>
     </Property1>
  </xsl:template>

 <xsl:template match="/Thing">
    <SubProperty1>
      <xsl:apply-templates select="SubProperty1" />
    </SubProperty1>
 </xsl:template>

 <xsl:template match="*" />

最後の行は、選択するように定義していないものをすべて削除する必要があります。

これは私のプロパティ 1 を選択するために機能しますが、サブプロパティには常に空のノードが選択されます。* の一致は、それらの一致が機能する前に、より深いオブジェクトを取り除いているようです。* の一致を削除すると、サブプロパティが値で選択されます。では、サブ プロパティを選択して、使用していないものをすべて取り除くにはどうすればよいでしょうか。

アドバイスをありがとう。

4

1 に答える 1

0

2つの問題があります

<xsl:template match="*"/>

これは、オーバーライドする、より具体的なテンプレートがない要素を無視します。

最上位要素の特定のテンプレートがないためRoot、そのサブツリー(完全なドキュメント)のすべてと一緒に無視され、出力はまったく生成されません。

2番目の問題はここにあります

<xsl:template match="/Thing">

このテンプレートは、という名前の一番上の要素と一致しThingます。

ただし、提供されているドキュメントでは、最上位の要素の名前はRootです。したがって、上記のテンプレートは、提供されたXMLドキュメントのどのノードとも一致せず、実行用に選択されることはありません。その本体内のコードはを生成することになっているのでSubProperty1、そのような出力は生成されません。

解決策

変化する

<xsl:template match="*"/>

<xsl:template match="text()"/>

そして変化する

<xsl:template match="/Thing">

<xsl:template match="Thing">

全体の変換は次のようになります:

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

      <xsl:template match="Property1">
         <Property1>
           <xsl:apply-templates/>
         </Property1>
      </xsl:template>

     <xsl:template match="Thing">
        <SubProperty1>
          <xsl:apply-templates select="SubProperty1" />
        </SubProperty1>
     </xsl:template>

     <xsl:template match="text()" />
</xsl:stylesheet>

そして、次のXMLドキュメントに適用すると(提供されたものはひどく不正な形式であるため、修正する必要がありました):

<Root>
    <Property1/>
    <Property2/>
    <Thing>
        <SubProperty1/>
        <SubProperty2/>
    </Thing>
    <VariousProperties/>
</Root>

結果は今求められているものです

<Property1/>
<SubProperty1/>
于 2012-07-25T03:43:58.843 に答える