2

条件に基づいてxmlからいくつかのタグを削除したいという要件が1つあります。

これが私の入力xmlです:

<?xml version="1.0" encoding="UTF-8"?>
<TCXML xmlns="http://www.tcxml.org/Schemas/TCXMLSchema">
<File creation_date="2012-09-20T07:28:47Z" elemId="id280" exportedFileName="sheet 1" last_mod_date="2012-09-20T07:28:48Z" text_flag="8192">

    <GSIdentity elemId="id111" label="R0dB1SzBBT4jNA"/>

</File>
  <File creation_date="2012-09-20T07:18:26Z" elemId="id283"exportedFileName="test part" last_mod_date="2012-09-20T07:18:26Z"  text_flag="8192">

    <GSIdentity elemId="id31" label="SIWBFqLyBT4jNA"/>

</File>
  <File creation_date="2012-09-20T07:21:03Z" elemId="id322" exportedFileName="test part3"  last_mod_date="2012-09-20T07:21:03Z"  text_flag="8192">

    <GSIdentity elemId="id46" label="ycUBFqLyBT4jNA"/>

</File>
  <File creation_date="2012-09-20T07:18:25Z" elemId="id285" exportedFileName="test part2"  last_mod_date="2012-09-20T07:18:25Z"  text_flag="4096">

    <GSIdentity elemId="id29" label="SQRBFqLyBT4jNA"/>

</File>

  <Sheet creation_date="2012-09-20T07:28:48Z" date_released="" ead_paragraph="" elemId="id185"  keep_limit_prop="3" last_mod_date="2012-09-20T07:28:48Z"  object_desc="" object_name="Sheet 1"  ref_list="#id111">

    <GSIdentity elemId="id112" label="R4WB1SzBBT4jNA"/>

</Sheet>


  <PART creation_date="2012-09-20T07:21:22Z" date_released="" ead_paragraph="" elemId="id435"  keep_limit_prop="3" last_mod_date="2012-09-20T07:21:28Z" object_name="dwgTest-AA-dwg1" ref_list="#id29 #id31">

    <GSIdentity elemId="id32" label="SxZBFqLyBT4jNA"/>

</PART>
  <PART creation_date="2012-09-20T07:21:23Z" date_released="2012-09-20T07:21:27Z" ead_paragraph="" elemId="id438"  keep_limit_prop="3" last_mod_date="2012-09-20T07:21:29Z"  object_name="dwgTest-AA-dwg2" ref_list="#id46">

    <GSIdentity elemId="id21" label="itfBFqLyBT4jNA"/>

</PART>
</TCXML>

PARTでref_listタグで参照されているFileタグをこのxmlから削除したいと思います。

私は次のxslで試しています、

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:plm="http://www.tcxml.org/Schemas/TCXMLSchema" version="1.0">
  <xsl:output method="xml" indent="yes"/>

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

<xsl:template match="plm:File">

    <xsl:variable name="Ref_List" select="translate(/plm:TCXML/plm:PART/@ref_list,' ','')" />
    <xsl:variable name="currentElementGSId" select="plm:GSIdentity/@elemId" />  
    <xsl:variable name="RefcurrentElementGSId" select="concat(string('#'),$currentElementGSId)" />  
    <xsl:choose>
        <xsl:when test="((contains($Ref_List,$RefcurrentElementGSId))=true())" >
            </xsl:when>
    <xsl:otherwise>
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" /> 
        </xsl:copy>         
    </xsl:otherwise>
    </xsl:choose>   
</xsl:template>

上記のxslは、xml内の1つのPARTに対してのみ機能し、xmlからのすべてのPARTタグに対しては機能しません。これは、xml内のすべてのPARTタグをループする方法です。よろしくお願いします。

このxmlの出力を次のように探しています。

<?xml version="1.0" encoding="UTF-8"?>
<TCXML xmlns="http://www.tcxml.org/Schemas/TCXMLSchema">
<File creation_date="2012-09-20T07:28:47Z" elemId="id280" exportedFileName="sheet 1" last_mod_date="2012-09-20T07:28:48Z" text_flag="8192">

    <GSIdentity elemId="id111" label="R0dB1SzBBT4jNA"/>

</File>

  <Sheet creation_date="2012-09-20T07:28:48Z" date_released="" ead_paragraph="" elemId="id185"  keep_limit_prop="3" last_mod_date="2012-09-20T07:28:48Z"  object_desc="" object_name="Sheet 1"  ref_list="#id111">

    <GSIdentity elemId="id112" label="R4WB1SzBBT4jNA"/>

</Sheet>


  <PART creation_date="2012-09-20T07:21:22Z" date_released="" ead_paragraph="" elemId="id435"  keep_limit_prop="3" last_mod_date="2012-09-20T07:21:28Z" object_name="dwgTest-AA-dwg1" ref_list="#id29 #id31">

    <GSIdentity elemId="id32" label="SxZBFqLyBT4jNA"/>

</PART>
  <PART creation_date="2012-09-20T07:21:23Z" date_released="2012-09-20T07:21:27Z" ead_paragraph="" elemId="id438"  keep_limit_prop="3" last_mod_date="2012-09-20T07:21:29Z"  object_name="dwgTest-AA-dwg2" ref_list="#id46">

    <GSIdentity elemId="id21" label="itfBFqLyBT4jNA"/>

</PART>
</TCXML>
4

2 に答える 2

2

より短く、より単純で、そして最も重要なこと:正しい解決策

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

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

 <xsl:template match="x:File">
  <xsl:if test=
  "not(/*/x:PART/@ref_list
                 [contains(concat(.,' '),
                           concat('#',
                                  current()/x:GSIdentity/@elemId,
                                  ' ')
                           )
                 ])">
    <xsl:call-template name="identity"/>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合:

<TCXML xmlns="http://www.tcxml.org/Schemas/TCXMLSchema">
    <File creation_date="2012-09-20T07:28:47Z" elemId="id280"
      exportedFileName="sheet 1" last_mod_date="2012-09-20T07:28:48Z"
      text_flag="8192">
        <GSIdentity elemId="id111" label="R0dB1SzBBT4jNA"/>
    </File>
    <File creation_date="2012-09-20T07:18:26Z" elemId="id283"
      exportedFileName="test part" last_mod_date="2012-09-20T07:18:26Z"
      text_flag="8192">
        <GSIdentity elemId="id31" label="SIWBFqLyBT4jNA"/>
    </File>
    <File creation_date="2012-09-20T07:21:03Z" elemId="id322"
      exportedFileName="test part3"  last_mod_date="2012-09-20T07:21:03Z"
      text_flag="8192">
        <GSIdentity elemId="id46" label="ycUBFqLyBT4jNA"/>
    </File>
    <File creation_date="2012-09-20T07:18:25Z" elemId="id285"
      exportedFileName="test part2"  last_mod_date="2012-09-20T07:18:25Z"
      text_flag="4096">
        <GSIdentity elemId="id29" label="SQRBFqLyBT4jNA"/>
    </File>
    <Sheet creation_date="2012-09-20T07:28:48Z" date_released=""
      ead_paragraph="" elemId="id185"  keep_limit_prop="3"
      last_mod_date="2012-09-20T07:28:48Z"  object_desc=""
      object_name="Sheet 1"  ref_list="#id111">
        <GSIdentity elemId="id112" label="R4WB1SzBBT4jNA"/>
    </Sheet>
    <PART creation_date="2012-09-20T07:21:22Z" date_released=""
    ead_paragraph="" elemId="id435"  keep_limit_prop="3"
    last_mod_date="2012-09-20T07:21:28Z" object_name="dwgTest-AA-dwg1"
    ref_list="#id29 #id31">
        <GSIdentity elemId="id32" label="SxZBFqLyBT4jNA"/>
    </PART>
    <PART creation_date="2012-09-20T07:21:23Z" date_released="2012-09-20T07:21:27Z"
    ead_paragraph="" elemId="id438"  keep_limit_prop="3"
    last_mod_date="2012-09-20T07:21:29Z"  object_name="dwgTest-AA-dwg2"
    ref_list="#id46">
        <GSIdentity elemId="id21" label="itfBFqLyBT4jNA"/>
    </PART>
</TCXML>

必要な正しい結果(4つのファイル要素のうち3つが「削除」されます)が生成されます。

<TCXML xmlns="http://www.tcxml.org/Schemas/TCXMLSchema">
    <File creation_date="2012-09-20T07:28:47Z" elemId="id280" exportedFileName="sheet 1" last_mod_date="2012-09-20T07:28:48Z" text_flag="8192">
        <GSIdentity elemId="id111" label="R0dB1SzBBT4jNA"/>
    </File>
    <Sheet creation_date="2012-09-20T07:28:48Z" date_released="" ead_paragraph="" elemId="id185" keep_limit_prop="3" last_mod_date="2012-09-20T07:28:48Z" object_desc="" object_name="Sheet 1" ref_list="#id111">
        <GSIdentity elemId="id112" label="R4WB1SzBBT4jNA"/>
    </Sheet>
    <PART creation_date="2012-09-20T07:21:22Z" date_released="" ead_paragraph="" elemId="id435" keep_limit_prop="3" last_mod_date="2012-09-20T07:21:28Z" object_name="dwgTest-AA-dwg1" ref_list="#id29 #id31">
        <GSIdentity elemId="id32" label="SxZBFqLyBT4jNA"/>
    </PART>
    <PART creation_date="2012-09-20T07:21:23Z" date_released="2012-09-20T07:21:27Z" ead_paragraph="" elemId="id438" keep_limit_prop="3" last_mod_date="2012-09-20T07:21:29Z" object_name="dwgTest-AA-dwg2" ref_list="#id46">
        <GSIdentity elemId="id21" label="itfBFqLyBT4jNA"/>
    </PART>
</TCXML>
于 2012-09-24T12:56:27.840 に答える
1

入力/出力が説明と一致しません:

ref_list タグを使用して PART で参照されているこれらのファイル タグをこの xml から削除したいと考えています。

次の XSLT は、その説明と同じ操作を実行します。

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:plm="http://www.tcxml.org/Schemas/TCXMLSchema" version="1.0">
    <xsl:output method="xml" indent="yes" />
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="plm:File">
        <xsl:choose>
            <xsl:when test="/plm:TCXML/plm:PART[contains(
                concat(' ', @ref_list, ' '), 
                concat(' #', current()/@elemId, ' '))]">
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy>
                    <xsl:apply-templates select="@*|node()" />
                </xsl:copy>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

2 番目のテンプレートは、任意の要素の属性で見つかったすべてのFile要素を破棄します。他のすべての要素はそのままコピーされます。elemIdref_listPARTFile

translate:最初の引数が文字列であることを期待しているため、テンプレートは期待どおりに機能しませんでした。次のルールに従って文字列に変換されたノード リストを渡しました。

ノード セットは、ドキュメント順で最初のノード セット内のノードの文字列値を返すことによって、文字列に変換されます。ノード セットが空の場合、空の文字列が返されます。

于 2012-09-24T06:15:00.607 に答える