带数组的 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>
这是为所有 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>