如何在XML中匹配ID并输出客户姓氏与金额?XSL文件排查
解决客户ID匹配金额的XSLT问题
嘿,我来帮你搞定这个问题!看起来你需要把<ClientList>里的客户姓氏和<AmountList>中对应ID的金额关联起来,生成包含这两个信息的输出XML。首先我先补全你没写完的示例XML(假设<AmountList>的结构是这样的,毕竟你没给出完整内容):
<?xml version="1.0" encoding="utf-8"?> <myData> <ClientList> <Client> <surname>Kowalski</surname> <id>12</id> </Client> <Client> <surname>Nowak</surname> <id>13</id> </Client> <!-- 更多客户记录 --> </ClientList> <AmountList> <Amount> <id>12</id> <value>1500.00</value> </Amount> <Amount> <id>13</id> <value>2200.50</value> </Amount> <!-- 更多金额记录 --> </AmountList> </myData>
接下来是能正常工作的XSLT代码,核心是用<xsl:key>建立ID和金额的索引,这样匹配起来高效又准确:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" encoding="utf-8"/> <!-- 建立AmountList中ID到金额的索引 --> <xsl:key name="amount-by-id" match="Amount" use="id"/> <xsl:template match="/myData"> <ClientAmounts> <!-- 遍历每个客户 --> <xsl:for-each select="ClientList/Client"> <ClientAmount> <surname><xsl:value-of select="surname"/></surname> <id><xsl:value-of select="id"/></id> <!-- 通过key找到对应ID的金额,无匹配时显示"无记录" --> <amount> <xsl:choose> <xsl:when test="key('amount-by-id', id)"> <xsl:value-of select="key('amount-by-id', id)/value"/> </xsl:when> <xsl:otherwise>无记录</xsl:otherwise> </xsl:choose> </amount> </ClientAmount> </xsl:for-each> </ClientAmounts> </xsl:template> </xsl:stylesheet>
为什么你的原XSL可能不工作?
- 没有使用索引(
<xsl:key>):如果原代码用嵌套循环逐个匹配ID,不仅效率低,还容易因路径错误或节点选择问题导致匹配失败。 - 节点路径错误:XML是大小写敏感的!比如你可能把
<Amount>写成了<amount>,或者金额节点名称写错,导致找不到对应值。 - 未处理无匹配场景:如果某个客户ID在
<AmountList>里没有对应记录,原代码可能输出空值或直接跳过该客户,不符合需求。
用上面的XSLT处理示例XML,会得到这样的输出:
<?xml version="1.0" encoding="utf-8"?> <ClientAmounts> <ClientAmount> <surname>Kowalski</surname> <id>12</id> <amount>1500.00</amount> </ClientAmount> <ClientAmount> <surname>Nowak</surname> <id>13</id> <amount>2200.50</amount> </ClientAmount> </ClientAmounts>
如果你的<AmountList>结构和我假设的不一样(比如金额节点叫amount而非value),只需要修改XSLT里对应的节点路径就行啦!
内容的提问来源于stack exchange,提问作者Name
相关产品推荐
相关产品推荐

