1

私はxsltの初心者であり、子要素の属性値の1つが特定の文字列と一致する場合、xmlファイルからノード全体を削除する必要があります。入力xmlファイルは次のとおりです。

    <?xml version="1.0" encoding="UTF-8"?>
    <gpm xmlns="http://www.airbus.com/topcased/gPM" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.airbus.com/topcased/gPM">
    <version>1.2</version>
        <version>1.2</version>
<filters>
  <sheetFilter description=" " labelKey="Liste de distribution" hidden="false">
    <userLogin>TO44452</userLogin>
    <resultSummary>
      <fieldResult name="DL_NAME"/>
      <fieldResult name="DL_USERS"/>
      <fieldResult name="$SHEET_STATE"/>
    </resultSummary>
    <scope>
      <productScope name="$CURRENT_PRODUCT" includeSubProducts="false"/>
    </scope>
    <containers>
      <sheetTypeRef name="DistributionList"/>
    </containers>
  </sheetFilter>
  <sheetFilter .../>
          ....
        </filters>
    </gpm>

要素のname属性が特定の値と一致する場合は、ノード全体を削除する必要があります。

私が使用したxsltファイルは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.1"
    xmlns="http://www.airbus.com/topcased/gPM"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:gpmns="http://www.airbus.com/topcased/gPM"
    exclude-result-prefixes="gpmns">

    <xsl:output method="xml" encoding="UTF-8" indent="yes" />

    <!-- Delete extra blank lines -->
    <xsl:strip-space elements="*"/>

    <!-- template for any attribute node, copy  -->
    <xsl:template match="*|@*" name="copy_all">
        <xsl:copy disable-output-escaping="yes">
            <xsl:apply-templates select="@*"/>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>

        <xsl:template match="gpmns:sheetTypeRef[@name = 'DL']">
        <xsl:apply-templates match="gpmns:sheetFilter"/>
        </xsl:template> 
</xsl:stylesheet> 

私が得た変換は次のとおりです:

<?xml version="1.0" encoding="UTF-8"?>
<gpm xmlns="http://www.airbus.com/topcased/gPM" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.airbus.com/topcased/gPM">
<version>1.2</version>
<filters>
<sheetFilter description=" " labelKey="Liste de distribution" hidden="false">
<userLogin>TO44452</userLogin>
<resultSummary>
<fieldResult name="DL_NAME"/>
<fieldResult name="DL_USERS"/>
<fieldResult name="$SHEET_STATE"/>
</resultSummary>
<scope>
<productScope name="$CURRENT_PRODUCT" includeSubProducts="false"/>
</scope>
<containers/>
</sheetFilter>
<sheetFilter ..... />

前もって感謝します..

4

2 に答える 2

0

それを管理するには、少なくとも 2 つの可能性があります。

<xsl:apply-templates select="filters/sheetFilter"/>

<xsl:template match="filters/sheetFilter[containers/sheetTypeRef/@name != 'DL']">
    … your output goes here …
</xsl:template>

また

<xsl:apply-templates select="filters/sheetFilter[containers/sheetTypeRef/@name != 'DL']"/>

<xsl:template match="filters/sheetFilter">
    … your output goes here …
</xsl:template>

あなたの目的に応じて。

于 2012-11-29T07:37:22.580 に答える
0

最後に、次のような解決策を見つけることができました。誰かにとって役立つかもしれません。

<xsl:template match="sheetFilter[*/sheetTypeRef[@name='DistributionList']]"/> 

ご提案いただきありがとうございます。

スーザン

于 2012-12-07T05:51:49.867 に答える