xml - 如何使用 xslt 按功能将元素的值与其他兄弟姐妹的值进行比较
问题描述
我有以下 xml -
<Invoices>
<Invoice>
<InvoiceNum>1234</InvoiceNum>
<BusinessNum>9999</BusinessNum>
</Invoice>
<Invoice>
<InvoiceNum>1234</InvoiceNum>
<BusinessNum>9999</BusinessNum>
</Invoice>
<Invoice>
<InvoiceNum>1235</InvoiceNum>
<BusinessNum>9998</BusinessNum>
</Invoice>
<Invoice>
<InvoiceNum>1235</InvoiceNum>
<BusinessNum>9990</BusinessNum>
</Invoice>
</Invoices>
首先,我必须根据发票编号按此 XML 进行分组,然后仅当发票编号的节点的业务编号相同时,我才必须进行映射。例如 - InvoiceNum 1234 是允许的,因为两个节点中的 BusinessNum 相同,而不允许使用 1235,因为两个节点中的 businessNum 不同。
我在 XSLT 下尝试过 -
<xsl:for-each-group select="/Invoices" group-by="Invoice">
<xsl:if test="preceding-sibling::current-group()/BusinessNum[1] = BusinessNum">
</xsl:if>
// Further mapping
上面的 XSLT 映射不起作用。你能帮我用 xslt 2.0 做这个映射吗?
解决方案
以下 xslInvoiceNum
通过检查BusinessNum
每个组中的所有值是否相同来选择 "allowed" 的值:
<xsl:template match="Invoices">
<xsl:for-each-group select="Invoice" group-by="InvoiceNum">
<xsl:if test="count(distinct-values(current-group()/BusinessNum))=1">
<xsl:value-of select="current-grouping-key()"/>
</xsl:if>
</xsl:for-each-group>
</xsl:template>
推荐阅读
- javascript - 如何使 Vue Sortable 在桌面上工作?
- c++ - 将文件中的数据存储到数组中,然后在 C++ 中从文件中读取特定的行和列
- spring - Spring Cloud Sleuth 之类的实现是如何实现的?
- java - 如何使输入可选,或如何检查输入流上是否有任何标记
- opengl - 在没有 OpenGL 的情况下如何绘制到显示器上?
- c - 使用 qsort 对字符串数组进行排序
- java - 使用 Java 8、Spring Boot Starter 2.1.9 和 Lombok 1.18.10 将 JSON 反序列化为 Enum
- c# - 启用 HSTS 的站点和渗透测试
- matlab - 如何在matlab中进行平滑操作?
- python - 显示脚本的 curses GUI,即使是重定向输出