我有两个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。我想答案就在那些方法中。
我希望有人可以帮助我。
谢谢,再见!
答案 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>