求实现父子关系的XSLT 1.0代码(附发票XML输入示例)
没问题,我来帮你搞定这个XSLT 1.0的需求!从你给出的输入XML来看,应该是要对相同INVOICE_ID的发票行进行分组处理对吧?我默认你想要的是把同一个发票ID下的所有行号整合到一起输出,下面是实现这个需求的XSLT 1.0代码,用的是XSLT 1.0里常用的Muenchian分组方法:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 定义分组键:以INVOICE_ID的值作为分组依据 --> <xsl:key name="invoice-by-id" match="invoice" use="INVOICE_ID"/> <!-- 设置输出格式为缩进的XML --> <xsl:output method="xml" indent="yes"/> <xsl:template match="/invoices"> <invoice_groups> <!-- 遍历每个分组的首个invoice节点,实现去重分组 --> <xsl:for-each select="invoice[generate-id() = generate-id(key('invoice-by-id', INVOICE_ID)[1])]"> <invoice_group> <!-- 复制当前分组的发票ID --> <xsl:copy-of select="INVOICE_ID"/> <!-- 汇总当前分组下的所有行号 --> <LINE_NUMBERS> <xsl:for-each select="key('invoice-by-id', INVOICE_ID)"> <xsl:copy-of select="LINE_NUMBER"/> </xsl:for-each> </LINE_NUMBERS> </invoice_group> </xsl:for-each> </invoice_groups> </xsl:template> </xsl:stylesheet>
代码说明:
<xsl:key>:定义分组规则,把所有invoice节点按照INVOICE_ID的值归类到不同分组里;generate-id()判断:通过对比节点的生成ID,确保每个发票ID只被处理一次,避免重复输出分组;- 分组内遍历:通过
key()函数取出当前ID对应的所有发票行,把行号统一汇总到LINE_NUMBERS节点下。
如果你的预期输出不是这种分组整合的形式(比如只是调整节点结构、输出文本格式等),可以告诉我具体的输出样式,我再帮你调整代码~
内容的提问来源于stack exchange,提问作者Malik Ammar
相关产品推荐
相关产品推荐

