我有一个单词表和一个文本,我想匹配并指定具有属性的元素
问题描述:
我有两个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>