2

こんにちは私はしばらくの間xmlのいくつかの部分を削除しようとしてきましたが、それは単に私のために機能していません。私の要件をリストすることから始めましょう:

1.例のように、値が空白であるか、値の長さが1未満であるすべてのノード属性を削除します。

<pr:Text default="" approved="true" type="">Mon-Sun 12HR</pr:Text>

になる必要があります<pr:Text approved="true">Mon-Sun 12HR</pr:Text>

私はこの部分をこれでカバーしたと思います(私は思う)、私が間違っているなら私を訂正してください:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="@*|node()">
    <xsl:if test=". != ''">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

2.子にテキスト値がないノード(要素)全体を削除します。例:

<pr:WorkingHoursInfo>
    <pr:WorkingHoursList>
              <pr:WorkingHours dayOfweek="MONDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="TUESDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="WEDNESDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="THURSDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="FRIDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="SATURDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="SUNDAY">
            </pr:WorkingHours>
    </pr:WorkingHoursList>
</pr:WorkingHoursInfo>

になるはずです:

<pr:WorkingHoursInfo>
</pr:WorkingHoursInfo>

したがって、可能であれば、これら2つの変換を一度に実行する必要があります。私は現在この#2で立ち往生しています。

質問の更新:

回答ごとMartin Honnenにxslファイルを次のように変更しました:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="@*[not(normalize-space())]"/>
<xsl:template match="*[not(*/*) and not(*[normalize-space()])]"/>
</xsl:stylesheet>

しかし、現在、要件1.に違反しているため<pr:Text default="" approved="true" type="">Mon-Sun 12HR</pr:Text>、xmlから削除されます。

別の更新:

Martin Honnenほぼ機能しているので、機能12ていて(ほぼ)機能しています。1つの例外は、テキスト値を持たない子のない単一の要素が削除されないことです。

<pr:DescriptionAttribute Type="PRIMARY"/>

これも削除する必要があります。ですから、ほとんど機能しています。

4

1 に答える 1

1

あなたは

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

次に、あなたが持っているタスクのテンプレートを追加します。

<xsl:template match="@*[not(normalize-space())]"/>

空の属性が削除され、

<xsl:template match="*[not(normalize-space()) and not(*/*) and not(*[normalize-space()])]"/>

孫要素がなく、テキストを含む子がない要素が確実に削除されます。

[編集]これが完全なスタイルシートです

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

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


<xsl:template match="@*[not(normalize-space())]"/>

<xsl:template match="*[not(normalize-space()) and not(*/*) and not(*[normalize-space()])]"/>

</xsl:stylesheet>

Saxon6.5.5を使用してそのスタイルシートを入力に適用すると

<pr:root
  xmlns:pr="http://example.com/pr">

<pr:WorkingHoursInfo>
    <pr:WorkingHoursList>
              <pr:WorkingHours dayOfweek="MONDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="TUESDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="WEDNESDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="THURSDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="FRIDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="SATURDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="SUNDAY">
            </pr:WorkingHours>
    </pr:WorkingHoursList>
</pr:WorkingHoursInfo>

<pr:Text default="" approved="true" type="">Mon-Sun 12HR</pr:Text>

<pr:DescriptionAttribute Type="PRIMARY"/>

</pr:root>

その結果は

<pr:root xmlns:pr="http://example.com/pr">

<pr:WorkingHoursInfo>

</pr:WorkingHoursInfo>

<pr:Text approved="true">Mon-Sun 12HR</pr:Text>



</pr:root>

したがって、空の要素<pr:DescriptionAttribute Type="PRIMARY"/>は削除されます。

于 2012-07-23T13:55:06.317 に答える