我有一个wordlist和我想要匹配的文本,并为元素分配属性

时间:2013-12-10 09:44:51

标签: xml xslt

我有两个XML文件,一个是word-database,另一个是我想要与数据库匹配的文本。我尝试了几种方法,但没有达到我想要的效果。

假设我们有这两个文件:

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并检查单词。它读取“hello”,转到database.xml,检查“hello”并分配它找到的属性paragraph,line,wordno。

我无法真正贡献样本XSL,我知道这是不好的形式,但我没有取得多大成就。我有几种方法,但没有从中获得任何东西。我尝试使用document-function,xsl:sort,xsl:analzye-string,xsl:for-each group,xsl:tokenize。我想答案就在那些方法中。

我希望有人可以帮助我。

谢谢,再见!

1 个答案:

答案 0 :(得分: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>