2013-12-10 4 views
1

У меня есть два файла 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> 

XSL не нужно считать абзацы или строки. Я просто хочу, чтобы он зашел в файл test.xml и проверил слова. Он читает «привет», переходит к базе данных.xml, проверяет «привет» и назначает атрибуты paragraph, line, wordno, которые он находит там.

Я не могу вносить образец XSL, и я знаю, что это плохая форма, но я не достиг многого. У меня было несколько подходов, но ничего не получилось. Я попробовал это с помощью функции document, xsl: sort, xsl: analzye-string, xsl: for-each group, xsl: tokenize. Я думаю, что ответ лежит где-то в этих подходах.

Я надеюсь, что кто-то может мне помочь.

Спасибо и прощай!

ответ

2

Вы могли бы начать с этого фрагмента кода, и адаптировать его в соответствии с вашими правилами лексического (он работает с образцом):

<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> 
Смежные вопросы