带数组的 XPath XSLT 条件处理

XPath XSLT conditional processing with array

这是为所有 XPath 和 XSLT 天才准备的!

这是 XLIFF 文件的摘录,我需要删除标签之间的文本,其中属性值与 ID 号数组中的任何一个相匹配,但重要的是只有当它在特定标签边界内时,<target> 标签要准确。

对于 XSLT 和你们中的一位专家来说,这可能是一项简单的任务,但这是我的最后一招,现在我一直在努力尝试使用 Perl 来处理这个问题,Perl 由于在多个正负环视中挣扎而不够可靠行。

例如(请参阅下面更完整的示例)在下面的代码片段中,我需要删除 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> 树中可以有多个 "matchable" 项,如下面最后的 <igroup> 所示。该文件可能有数千个这样的 igroup 节点,并且 igroup 不是顶级。

例如,在 pid 数组中,我们有 [569 570 587],因此只有那些 <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>

我相信我得到你想要的。

你的例子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>