【问题标题】:compare values in two xml files比较两个 xml 文件中的值
【发布时间】:2018-11-08 07:51:54
【问题描述】:

我有以下格式的xml文件sentence.xml:

<doc>
   <sentence id="sent_1" span="word_1..word_8"/>
   <sentence id="sent_2" span="word_9..word_15"/>
   <sentence id="sent_3" span="word_16..word_22"/>
   <sentence id="sent_4" span="word_23..word_30"/>
</doc>

这个 xml 文件显示,例如,我的第一个带有 @id="sent_1" 的句子是从 word_1 到 word_8。第二句(@id="sent_2")是从word_9到word_15等。

我的第二个 xml 文件 verb.xml 具有以下格式。

<verb id="v1" span="word_3"/>
<verb id="v2" span="word_7"/>
<verb id="v3" span="word_14"/>
<verb id="v4" span="word_27"/>

这意味着:第一个动词(@id="v1")是“word_3”;第二个动词(@id="v2")是“word_7”等。

如果我们比较两个 xml 文件,我们会看到,例如verb.xml 中的第一个动词 (v1),即 word_3,属于第一个句子 (sent_1);第三个动词 (v3) 是 word_14 属于第二个句子 (sent_2) 等等。

我想要的输出是比较两个文件的 span 属性的值,看看动词属于哪个句子。例如,在跨度 word_1..word_8(这是我们的第一句话)中某处的 word_3。输出应如下所示:

<verb id="v1" span="word_3" ref="sent_1"/>
<verb id="v2" span="word_7" ref="sent_1"/>
<verb id="v3" span="word_14" ref="sent_2"/>
<verb id="v4" span="word_27" ref="sent_4"/>

我希望我的解释清楚。 谢谢。

【问题讨论】:

    标签: xml xslt transformation


    【解决方案1】:

    您需要从word_1..word_8 等范围描述中提取数字,然后从word_3 等跨度值中提取的数字中引用它们。在 XSLT 3 中,您可以通过为 sentence 元素设置的键轻松地做到这一点:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="xs"
        version="3.0">
    
      <xsl:param name="sentence-doc">
        <doc>
           <sentence id="sent_1" span="word_1..word_8"/>
           <sentence id="sent_2" span="word_9..word_15"/>
           <sentence id="sent_3" span="word_16..word_22"/>
           <sentence id="sent_4" span="word_23..word_30"/>
        </doc>
      </xsl:param>
    
      <xsl:key name="ref" match="sentence" 
        use="let $numbers := analyze-string(@span, 'word_([0-9]+)\.\.word_([0-9]+)')//*:group/xs:integer(.)
             return $numbers[1] to $numbers[2]"/>
    
      <xsl:mode on-no-match="shallow-copy"/>
    
      <xsl:template match="verb">
          <verb id="{@id}" span="{@span}" ref="{key('ref', @span => replace('[^0-9]+', '')=>xs:integer(), $sentence-doc)/@id}"/>
      </xsl:template>
    
    </xsl:stylesheet>
    

    有关在线演示,请参阅 https://xsltfiddle.liberty-development.net/3NzcBt2。当然,对于您有两个输入文档的情况,您可以使用&lt;xsl:param name="sentence-doc" select="doc('sentence.xml')"/&gt;,而不是像我在在线示例中所做的那样包括内联数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多