2017-04-13 66 views
0

這是一個適用於所有XPath和XSLT天才的項目!帶數組的XPath XSLT條件處理

這是一個來自XLIFF文件的摘錄,我需要刪除標籤之間的文本,其中屬性值與任何一個id數字相匹配,但重要的是,只有當它位於特定標籤邊界內時,<target>標籤纔是精確。

這對於XSLT和你的一位大師來說可能是一個簡單的任務,但它是關於我最後的手段,現在一直在試圖用Perl來處理這個問題,由於在多行上正反兩方面的爭執, 。

例如(請參閱下面的更全面的示例),我需要刪除<emp>標記(其中pid =「569」和pid =「570」)之間的文本,但僅限嵌套在<target>標記中。 <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節點,而igroups不是最高級別的。

例如,在我們有[569 570 587]的pid數組中,只有那些<target>節點,其中<emp>具有與需要處理的pid相匹配的屬性「pid」。例如,必須刪除內部文本,包括任何嵌入的標籤,只留下<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

嗨邁克爾,謝謝你的看法和道歉,如果我的術語不正確 - 我沒有經驗的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

天啊。這看起來很完美,是的,你是對的後裔節點我向我的帽子邁向你的知識邁克爾,我很高興接受你的答案。我現在可以動態地填充'',只需額外的'\ @ '在Perl中逃脫。我想知道,如果pids數組變得非常大,是否有任何性能限制。它可能有成千上萬。時間會證明。非常感謝:-) – user3012857