1

XSLT を使用して、指定された XML の下から親ノードを削除する際に助けが必要です..

<?xml version="1.0" encoding="UTF-8"?>
<Report xmlns="OpenProblems2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="OpenProblems2" Name="OpenProblems2">
   <Hello>
      <NewDataSet>
         <Table>
            <a>1832874</a>
            <b>HUME-9063</b>
            <c>not informed</c>
         </Table>
         <Table>
            <a>1832874</a>
            <b>HUME-9063</b>
            <c>not informed</c>
         </Table>
      </NewDataSet>
   </Hello>
</Report>

出力は次のようになります-

<NewDataSet>
<Table>
  <a>1832874</a> 
  <b>HUME-9063</b> 
  <c>not informed</c>
</Table>
<Table>
  <a>1832874</a> 
  <b>HUME-9063</b> 
  <c>not informed</c>
</Table>
</NewDataSet>

XSLT は、Report、Hello、および NewDataset 要素を削除する必要があります。お願いします...あなたの助けは非常に高く評価されます。

4

3 に答える 3

0

この種の要件は、ID テンプレートを使用して対処するのが最適です。ID テンプレートを使用すると、XML の大部分を変更せずに通過させ、必要な部分のみを処理できます。単純な ID は次のようになります。

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

これは、すべての属性、コメント、要素などに一致し、それらを出力にコピーします。より具体的な一致が優先されます。

あなたのサンプル出力は実際にはNewDataSet要素を削除していないので、どちらも削除していません。削除したい場合は、以下のテンプレートに追加してください (ただし、出力の形式が崩れることに注意してください)。

<xsl:template match="Hello|Report">
    <xsl:apply-templates/>
</xsl:template>

Helloこのテンプレートは要素と要素の両方に一致Reportし、実際のノードを出力にコピーせずにテンプレートを子に適用するだけでそれらを処理します。

したがって、次のようなスタイルシート:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns="OpenProblems2">

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

    <xsl:template match="Hello|Report">
        <xsl:apply-templates/>
    </xsl:template>

</xsl:stylesheet>

サンプル入力を受け取り、サンプル出力を生成します。@ian-roberts が指摘しているように、本当に名前空間を削除したい場合は、それも処理する必要があります。

于 2013-10-29T11:27:06.660 に答える