我有一个单词表和一个文本,我想匹配并指定具有属性的元素

问题描述:

我有两个XML文件,一个是单词数据库,另一个是我想与数据库匹配的文本。我尝试了几种方法,但都没有达到我想要的结果。我有一个单词表和一个文本,我想匹配并指定具有属性的元素

说我们有这两个文件:

database.xml

<?xml version="1.0" encoding="UTF-8"?> 
<wordbase> 
    <word> 
     <paragraph>1</paragraph> 
     <line>1</line> 
     <wordno>1</wordno> 
     <trans>hello</trans> 
    </word> 
    <word> 
     <paragraph>2</paragraph> 
     <line>1</line> 
     <wordno>2</wordno> 
     <trans>example</trans> 
    </word> 
    <word> 
     <paragraph>2</paragraph> 
     <line>1</line> 
     <wordno>2</wordno> 
     <trans>this</trans> 
    </word>  
</wordbase> 

和第二个文件text.xml

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <p> 
     <l>hello</l> 
    </p> 
    <p> 
     <l>this example</l> 
    </p> 
</root> 

因此,我希望得到这样的:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <p> 
     <l><w paragraph="1" line="1" wordno="1">hello</w></l> 
    </p> 
    <p> 
     <l><w paragraph="2" line="1" wordno="1">this</w> <w paragraph="2" line="1" wordno="2">example</w></l> 
    </p> 
</root> 

The XSL不需要对段落或行进行计数。我只是希望它进入文件test.xml并检查单词。它读取“hello”,进入database.xml,检查“hello”并指定它在那里找到的段落,行,单词的属性。

我真的无法提供示例XSL,并且我知道这是不好的形式,但我没有取得多大成就。我有几种方法,但没有从中获得什么。我用文档函数xsl:sort,xsl:analzye-string,xsl:for-each group,xsl:tokenize来试用它。我想这个答案在某些地方。

我希望有人能帮助我。

谢谢,再见!

你可以从这个代码片断开始,并根据您的符号化规则(它与你的样品)适应它:

<xsl:template match="*"> 
    <xsl:copy> 
    <xsl:apply-templates select="*" /> 
    </xsl:copy> 
</xsl:template> 

<xsl:template name="tokenize"> 
    <xsl:param name="tokens" /> 
    <xsl:variable name="token" select="substring-before($tokens, ' ')" /> 
    <xsl:if test="$token != ''"> 
    <xsl:variable name="word" select="document('wordbase.xml')/wordbase/word[trans = $token]" />   
    <w paragraph="{$word/paragraph}" line="{$word/line}" wordno="{$word/wordno}"> 
     <xsl:value-of select="$token"/> 
    </w> 
    <xsl:call-template name="tokenize"> 
     <xsl:with-param name="tokens" select="substring-after($tokens, ' ')" /> 
    </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

<xsl:template match="l"> 
    <xsl:copy> 
    <xsl:call-template name="tokenize"> 
     <xsl:with-param name="tokens" select="concat(text(), ' ')" /> 
    </xsl:call-template> 
    </xsl:copy> 
</xsl:template>