我需要实现一个包含许多参数的路由表。
例如,我在下面的传入消息中声明了五个属性
Customer Txn Group Txn Type Sender Priority Target
UTI CORP ONEOFF ABC LOW TRG1
UTI GOV ONEOFF ABC LOW TRG2
用 XML 表示此数据以便高效查询的最佳方式是什么?
我想将这些数据存储在 XML 中,并使用 Java 将其加载到内存中,当消息传入时,我想根据属性来识别目标。
感谢任何意见。
谢谢, 芒格鲁
最佳答案
这是一个纯 XML 表示形式,可以按原样进行非常高效的处理,无需转换为任何其他内部数据结构:
<table>
<record Customer="UTI" Txn-Group="CORP"
Txn-Type="ONEOFF" Sender="ABC1"
Priority="LOW" Target="TRG1"/>
<record Customer="UTI" Txn-Group="Gov"
Txn-Type="ONEOFF" Sender="ABC2"
Priority="LOW" Target="TRG2"/>
</table>
有一种非常有效的方法可以使用 <xsl:key>
查询这种格式的数据。指令和 XSLT key()功能:
这种转变:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:key name="kRec" match="record"
use="concat(@Customer,'+',@Sender)"/>
<xsl:template match="/">
<xsl:copy-of select="key('kRec', 'UTI+ABC2')"/>
</xsl:template>
</xsl:stylesheet>
应用于上述 XML 文档时会产生所需的结果:
<record Customer="UTI"
Txn-Group="Gov" Txn-Type="ONEOFF"
Sender="ABC2" Priority="LOW"
Target="TRG2"/>
请注意以下事项:
可以有多个
<xsl:key>
定义,使用不同的值组合来连接在一起(无论什么被视为“键”和/或“主键”)来标识记录。如果
<xsl:key>
被定义为使用“主键”的串联,那么在评估 key() 函数时将找到唯一记录(或没有记录)。如果
<xsl:key>
被定义为使用“非主键”的串联,那么在计算 key() 函数时可能会找到多个记录。<xsl:key>
指令相当于在数据库中定义索引。这使得使用 key() 函数极其高效。在许多情况下,没有必要将上述 XML 形式转换为中间数据结构,这既不是出于可理解性的原因,也不是出于效率的原因。
关于java - 在 XML 中存储二维表(决策表)以实现高效查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/534807/