【问题标题】:Computing XML document similarity based on tags基于标签计算XML文档相似度
【发布时间】:2015-01-21 13:37:25
【问题描述】:

作为一种计算 XML 文档之间相似度(通常是几个,但在这种情况下是两个)的方法,基于标签的相似度计算有几个应用。现在,如何使用 XSLT 实现这样的方法。

我是这样想的: 提取标签并为两个文档列出它们。接下来,检查两个列表之间的完全/部分匹配。

在这方面,XSLT 是否提供任何用于比较字符串(标签)的函数/操作。 欢迎任何关于概念和实施的想法。

简单示例:

对于这些 XML 文档(当然是其中的一部分),

<book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>

还有这个,

  <books>
      <authorname>Ralls, Kim</authorname>
      <booktitle>Midnight Rain</booktitle>
      <genre>Fantasy</genre>
      <cost>5.95</cost>
      <date>2000-12-16</date>
      <abstract>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</abstract>
   </books>

两个文档都有六个元素(标签),其中流派出现在两者中,标题类似于书名,作者带有作者名,发布日期带有日期。所以,这两者是相似的。 (1个完全匹配,3个部分匹配)

【问题讨论】:

  • 您使用的是什么 XSLT 处理器(及其版本)?和yes, it's possible。具有完全不同层次结构和属性的 XML 文档呢?您期待什么样的 XML 文档?
  • 一个文档中的“books”是否与另一个文档中的“book”不相似?为什么“书”或“书”没有出现在您的计数中?您是否正在使用要查找或比较的单词列表?如果一个文档的元素名为“author”,而另一个文档的元素名为“authority”,会发生什么?
  • 我不认为 Xslt 确实为您正在寻找的那种模糊匹配提供任何有用的机制。我想你必须使用“真正的”差异化工具/lib。
  • ... 并补充马丁已经指出的案例:为什么第一个文档中的“书”与第二个文档中的“书名”不匹配?
  • @MathiasMüller,如果它很重要,我会使用 Altova XML Spy 2011 和 xsltransform.net。提供的示例是一个快速而简单的示例;因此我们可能无法控制文档的详细信息,因此它们可能完全不同。

标签: xml xslt pattern-matching string-matching similarity


【解决方案1】:

假设 XSLT 2.0 将第一个 XML 文档作为其输入,将第二个文档的 URL 作为参数,然后为第一个文档中的每个元素名称输出一个名称列表,这些名称包含或包含第二个文档中的名称:

<xsl:stylesheet
  version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs">

<xsl:output method="text"/>  

<xsl:param name="doc2-url" as="xs:string" select="'test2015012102.xml'"/>
<xsl:variable name="doc2" as="document-node()" select="doc($doc2-url)"/>
<xsl:variable name="doc2-names" as="xs:string*" select="distinct-values($doc2//*/local-name())"/>

<xsl:template match="/">
  <xsl:value-of select="for $name in distinct-values(//*/local-name())
                        return concat($name, ': ', string-join($doc2-names[contains($name, .) or contains(., $name)], ', '))"
                separator="&#10;"/>
</xsl:template>

</xsl:stylesheet>

所以对于您的示例,输出是

book: books, booktitle
author: authorname
title: booktitle
genre: genre
price:
publish_date: date
description: 

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 2017-03-15
    • 2019-10-23
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多