2017-04-13 15 views
0

これはすべてあなたのXPathとXSLTの天才のためのものです!XPath XSLT配列による条件付き処理

これは、属性値がID番号の配列のいずれかと一致するタグ間のテキストを削除する必要があるが、重要なことに特定のタグ境界内にある場合にのみ、<target>タグを正確。

これはXSLTとあなたの指導者のための簡単な作業かもしれませんが、私の最後の手段は、複数の行にわたる肯定的および否定的な解決策との闘いのために十分に信頼できないPerlでこれを処理しようと苦労したことです。

以下のスニペットの例(詳細は下の例をご覧ください)タグの中に入れ子になっている場合のみ、pid = "569"とpid = "570"の<emp>タグの間のテキストを削除する必要があります。 <alt-source<t><emp>ツリー内の、同じくpid = "569"、pid = "570"のテキストもそのまま残す必要があります。

  <alt-source> 
        <t id="4507"> 
         <emp ptype="para" pid="569">Q27a.</emp> 
         <emp ptype="para" pid="570"> 
          <t id="4516">Before 1996</t><t id="4537"> [this/that] </t>did not exist</emp> 
        </t> 
       </alt-source> 
       <target> 
        <t id="4507"> 
         <emp ptype="para" pid="569">Q27a.</emp> 
         <emp ptype="para" pid="570"> 
          <t id="4516">Before 1996</t><t id="4537"> [this/that] </t>did not exist</emp> 
        </t> 
       </target> 

内のテキストにもタグが埋め込まれていて、空白の違いがあることに注意してください。 <target>ツリーには、最終的には<igroup>のように、複数の「一致する」アイテムが存在する可能性があります。このファイルには数千のigroupノードが含まれ、igroupは最上位ではありません。

たとえば、pidの配列では、[p595]があるので、これらのpidに一致する属性「pid」を持つ<target>ノードのみが処理される必要があります。埋め込みタグを含めて、内部テキストを削除する必要があります。たとえば、ちょうど<emp ptype="para" pid="587"></emp>です。

これはXSLTでも可能ですか?

ご協力いただければ幸いです!

  <igroup> 
       <source> 
        <t id="4612">3 times per day or more</t> 
       </source> 
       <alt-source> 
        <t id="4612"> 
         <emp ptype="para" pid="585">3 times per day or more</emp> 
        </t> 
       </alt-source> 
       <target> 
        <t id="4612"> 
         <emp ptype="para" pid="585">3 fois par jour ou plus</emp> 
        </t> 
       </target> 
      <igroup> 
      <igroup> 
       <source> 
        <t id="4507">Q27a. </t><t id="4516">Before 1996</t><t id="4537"> [this/that] </t>did not exist</emp> 
       </source> 
       <alt-source> 
        <t id="4507"> 
         <emp ptype="para" pid="569">Q27a.</emp> 
         <emp ptype="para" pid="570"> 
          <t id="4516">Before 1996</t><t id="4537"> [this/that] </t>did not exist</emp> 
        </t> 
       </alt-source> 
       <target> 
        <t id="4507"> 
         <emp ptype="para" pid="569">Q27a.</emp> 
         <emp ptype="para" pid="570"> 
          <t id="4516">Before 1996</t><t id="4537"> [this/that] </t>did not exist</emp> 
        </t> 
       </target> 
      </igroup> 
      <igroup> 
       <source>a.</source> 
       <alt-source> 
        <emp ptype="para" pid="586">a.</emp> 
        <emp ptype="para" pid="587">b.</emp> 
        <emp ptype="para" pid="588">c.</emp> 
       </alt-source> 
       <target> 
        <emp ptype="para" pid="586">a.</emp> 
        <emp ptype="para" pid="587">b.</emp> 
        <emp ptype="para" pid="588">c.</emp> 
       </target> 
      </igroup> 
+1

私はあなたの質問を理解していません。期待される出力を見ることは助けになるかもしれませんが、あなたの用語はすべて間違っています。たとえば、テキストに「埋め込みタグ」を含めることはできません。 - P.S. XSLT 1.0または2.0を使用しているかどうかを明記してください。 –

+0

こんにちはMichael、私の用語が正しくない場合は、お探ししていただきありがとうございます。私はXPathやXSLTに慣れていません。埋め込みタグがあると言うと、 'emp'タグの中にある' t'タグのための上記の構造を見てください。それが私の言いたいことです。 XSLT 1.0または2.0を使用することができます。私はこれをPerlスクリプトの中で実行します。 – user3012857

答えて

2

私はあなたが望むものを得ると信じています。

例のXMLに問題があったため、調整する必要がありました。

レベルをスキップするために使用できる//を使用できます。

XSLT:

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

    <!-- this intercepts our specific elements --> 
    <xsl:template match="target//emp[@pid='569' or @pid='570' or @pid='587']"> 
    <!-- this copies element name --> 
    <xsl:copy> 
     <!-- this copies all its attributes --> 
     <xsl:copy-of select="@*"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

編集XML:

<igroup> 
    <source> 
    <t id="4612">3 times per day or more</t> 
    </source> 
    <alt-source> 
    <t id="4612"> 
     <emp ptype="para" pid="585">3 times per day or more</emp> 
    </t> 
    </alt-source> 
    <target> 
    <t id="4612"> 
     <emp ptype="para" pid="585">3 fois par jour ou plus</emp> 
    </t> 
    </target> 
    <igroup> 
    <igroup> 
     <source> 
     <emp ptype="para" pid="570"> 
      <t id="4507">Q27a. </t> 
      <t id="4516">Before 1996</t> 
      <t id="4537"> [this/that] </t> 
      did not exist 
     </emp> 
     </source> 
     <alt-source> 
     <t id="4507"> 
      <emp ptype="para" pid="569">Q27a.</emp> 
      <emp ptype="para" pid="570"> 
      <t id="4516">Before 1996</t> 
      <t id="4537"> [this/that] </t> 
      did not exist 
      </emp> 
     </t> 
     </alt-source> 
     <target> 
     <t id="4507"> 
      <emp ptype="para" pid="569">Q27a.</emp> 
      <emp ptype="para" pid="570"> 
      <t id="4516">Before 1996</t> 
      <t id="4537"> [this/that] </t> 
      did not exist 
      </emp> 
     </t> 
     </target> 
    </igroup> 
    <igroup> 
     <source>a.</source> 
     <alt-source> 
     <emp ptype="para" pid="586">a.</emp> 
     <emp ptype="para" pid="587">b.</emp> 
     <emp ptype="para" pid="588">c.</emp> 
     </alt-source> 
     <target> 
     <emp ptype="para" pid="586">a.</emp> 
     <emp ptype="para" pid="587">b.</emp> 
     <emp ptype="para" pid="588">c.</emp> 
     </target> 
    </igroup> 
    </igroup> 
</igroup> 

結果:

<?xml version="1.0" encoding="utf-8"?><igroup> 
    <source> 
    <t id="4612">3 times per day or more</t> 
    </source> 
    <alt-source> 
    <t id="4612"> 
     <emp ptype="para" pid="585">3 times per day or more</emp> 
    </t> 
    </alt-source> 
    <target> 
    <t id="4612"> 
     <emp ptype="para" pid="585">3 fois par jour ou plus</emp> 
    </t> 
    </target> 
    <igroup> 
    <igroup> 
     <source> 
     <emp ptype="para" pid="570"> 
      <t id="4507">Q27a. </t> 
      <t id="4516">Before 1996</t> 
      <t id="4537"> [this/that] </t> 
      did not exist 
     </emp> 
     </source> 
     <alt-source> 
     <t id="4507"> 
      <emp ptype="para" pid="569">Q27a.</emp> 
      <emp ptype="para" pid="570"> 
      <t id="4516">Before 1996</t> 
      <t id="4537"> [this/that] </t> 
      did not exist 
      </emp> 
     </t> 
     </alt-source> 
     <target> 
     <t id="4507"> 
      <emp ptype="para" pid="569" /> 
      <emp ptype="para" pid="570" /> 
     </t> 
     </target> 
    </igroup> 
    <igroup> 
     <source>a.</source> 
     <alt-source> 
     <emp ptype="para" pid="586">a.</emp> 
     <emp ptype="para" pid="587">b.</emp> 
     <emp ptype="para" pid="588">c.</emp> 
     </alt-source> 
     <target> 
     <emp ptype="para" pid="586">a.</emp> 
     <emp ptype="para" pid="587" /> 
     <emp ptype="para" pid="588">c.</emp> 
     </target> 
    </igroup> 
    </igroup> 
</igroup> 
+0

これは、どのような種類の、一致した 'emp'要素の**任意の**子孫ノードを削除することに注意してください。これはおそらくあなたが望むものですが、明示的に述べるべきです。 –

+0

ああ純粋な天才。それは完璧に見えます。そして、あなたは子孫ノードについて正しいです。私はあなたの知識マイケルに私の帽子を突きつけて、あなたの答えを受け入れることを非常に嬉しく思っています。 @ xid:template match = "target // emp [@ pid = '569'または@ pid = '570'または@ pid = '587']"> ' 'Perlでエスケープする。 pidの配列が非常に大きくなると、パフォーマンスに制限があるかどうか疑問に思っています。潜在的に何千もの可能性があります。時が教えてくれる。確かに多くの感謝:-) – user3012857

関連する問題