我正在尝试使用 XSLT 地图获取一个字段查看另一个字段

I am trying to fetch one field looking at another field using XSLT Maps

我正在尝试使用流式传输 (XSLT 3.0) 来处理报告输出,因为它的数量很大。由于特定的输出格式,我必须使用 XSLT。在转换报表输出时,我需要根据行级 Customer_Invoice 和存储在 "Customer_Invoice_and_Supplier" 中的 Supplier 的组合查找 "Supplier_Invoice_number"。我需要在行级别显示 "Supplier_Invoice_number"。

我创建了 XSLT 映射来存储 "Customer_Invoice_and_Supplier" 和 "Supplier_Invoice_number" 的值,这样在转换行时我可以获取 "Supplier_Invoice_number" 然后在输出中的行级别显示.下面是我创建的 XSLT,但我对 "Supplier_Invoice_number" 一片空白。我是 XSLT 地图和流媒体的新手,因此如果有人能指导我找到解决方案,我将不胜感激。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:map="http://www.w3.org/2005/xpath-functions/map" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wd="urn:com.workday/bsvc" xmlns:wd1="urn:com.workday.report/INT1109_CR_REV_Lookup_Supplier_Invoice_for_Customer_Invoice" xmlns:wd2="urn:com.workday.report/INT1109_CR_REV_Customer_Invoices_to_Connect" exclude-result-prefixes="xs" version="3.0">
<xsl:mode streamable="yes" on-no-match="shallow-skip" use-accumulators="SupplierInvoiceLookup CurrentLookupValue"/>
<xsl:output method="text"/>
<xsl:accumulator name="CurrentLookupValue" as="xs:string" initial-value="''" streamable="yes">
    <xsl:accumulator-rule match="wd1:Customer_Invoice_and_Supplier/text()" select="."/>
</xsl:accumulator>
<xsl:accumulator name="SupplierInvoiceLookup" as="map(xs:string,xs:string)" initial-value="map{}" streamable="yes">
    <xsl:accumulator-rule match="wd1:Supplier_Invoice_Number/text()" select="map:put($value, string(.), accumulator-before('CurrentLookupValue'))"/>
</xsl:accumulator>
<xsl:strip-space elements="*"/>
<xsl:template match="AggregatedData">
    <xsl:for-each select="wd2:Report_Data/wd2:Report_Entry/copy-of()">
        <xsl:text>{&#10;        "Company": "</xsl:text>
        <xsl:value-of select="wd2:Company"/>            
        <xsl:iterate select="wd2:lines">
            <xsl:text>      {&#10;</xsl:text>
            <xsl:text>        "sequence": "</xsl:text>
            <xsl:value-of select="wd2:sequence"/>
            <xsl:text>",&#10;</xsl:text>
            <xsl:text>        "sales_item_id": "</xsl:text>
            <xsl:value-of select="wd2:sales_item_id"/>
            <xsl:text>",&#10;</xsl:text>                
            <xsl:text>        "supplier_invoice_no": "</xsl:text>
            <xsl:variable name="supplier_invoice_no" select="accumulator-before('SupplierInvoiceLookup')( normalize-space( @wd2:Customer_Invoice_and_Supplier ) )"/>
            <xsl:value-of select="accumulator-before('SupplierInvoiceLookup')( normalize-space( @wd2:Customer_Invoice_and_Supplier ) )"/>
            <xsl:text>",&#10;</xsl:text>
        </xsl:iterate>            
    </xsl:for-each>
    <xsl:text>  &#10;</xsl:text>
</xsl:template>

示例 XML -

<?xml version="1.0" encoding="utf-8"?>
<AggregatedData>
    <wd:Report_Data xmlns:wd="urn:com.workday.report/INT1109_CR_REV_Lookup_Supplier_Invoice_for_Customer_Invoice">
        <wd:Report_Entry>
            <wd:Supplier_Invoice_Lines_group>
                <wd:Customer_Invoice_and_Supplier>INV-201900000024Dell Receivables LP</wd:Customer_Invoice_and_Supplier>
                <wd:Supplier_Invoice_Number>SI-00000047</wd:Supplier_Invoice_Number>
            </wd:Supplier_Invoice_Lines_group>
        </wd:Report_Entry>
        <wd:Report_Entry>
            <wd:Supplier_Invoice_Lines_group>
                <wd:Customer_Invoice_and_Supplier>INV-201900000024Charles Case [C]</wd:Customer_Invoice_and_Supplier>
                <wd:Supplier_Invoice_Number>SI-00000050</wd:Supplier_Invoice_Number>
            </wd:Supplier_Invoice_Lines_group>
        </wd:Report_Entry>
    </wd:Report_Data>
    <wd:Report_Data xmlns:wd="urn:com.workday.report/INT1109_CR_REV_Customer_Invoices_to_Connect">
        <wd:Report_Entry>
            <wd:Company>Financial/wd:Company>
            <wd:lines>
                <wd:sequence>a8</wd:sequence>
                <wd:sales_item_id>Data - Enterprise License</wd:sales_item_id>
                <wd:Customer_Invoice_and_Supplier>INV-201900000024Dell Receivables LP</wd:Customer_Invoice_and_Supplier>
            </wd:lines>
            <wd:lines>
                <wd:sequence>a9</wd:sequence>
                <wd:sales_item_id>TBA Trade Reports ATS Cncl</wd:sales_item_id>
                <wd:Customer_Invoice_and_Supplier>INV-201900000024Charles Case [C]</wd:Customer_Invoice_and_Supplier>
            </wd:lines>
        </wd:Report_Entry>
    </wd:Report_Data>
</AggregatedData>

由于某些原因,尽管您的输入有元素数据,但您使用了 @wd2:Customer_Invoice_and_Supplier 到 select 属性,所以我认为您想要

<xsl:template match="AggregatedData">
    <xsl:for-each select="wd2:Report_Data/wd2:Report_Entry/copy-of()">
        <xsl:text>{&#10;        "Company": "</xsl:text>
        <xsl:value-of select="wd2:Company"/>            
        <xsl:iterate select="wd2:lines">
            <xsl:text>      {&#10;</xsl:text>
            <xsl:text>        "sequence": "</xsl:text>
            <xsl:value-of select="wd2:sequence"/>
            <xsl:text>",&#10;</xsl:text>
            <xsl:text>        "sales_item_id": "</xsl:text>
            <xsl:value-of select="wd2:sales_item_id"/>
            <xsl:text>",&#10;</xsl:text>                
            <xsl:text>        "supplier_invoice_no": "</xsl:text>
            <xsl:value-of select="accumulator-before('SupplierInvoiceLookup')( normalize-space( wd2:Customer_Invoice_and_Supplier ) )"/>
            <xsl:text>",&#10;</xsl:text>
        </xsl:iterate>            
    </xsl:for-each>
    <xsl:text>  &#10;</xsl:text>
</xsl:template>

而且我认为您希望地图在键和值方面是相反的,这样累加器就可以了

<xsl:accumulator name="CurrentLookupValue" as="xs:string" initial-value="''" streamable="yes">
    <xsl:accumulator-rule match="wd1:Customer_Invoice_and_Supplier/text()" select="string()"/>
</xsl:accumulator>
<xsl:accumulator name="SupplierInvoiceLookup" as="map(xs:string,xs:string)" initial-value="map{}" streamable="yes">
    <xsl:accumulator-rule match="wd1:Supplier_Invoice_Number/text()" select="map:put($value, accumulator-before('CurrentLookupValue'), string(.))"/>
</xsl:accumulator>

https://xsltfiddle.liberty-development.net/ncdD7mu

如果您想输出 JSON 然后请注意 XSLT 3 与 XPath 3.1 映射和数组以及输出方法 json 确实允许以舒适的方式输出大括号和元素名称。但这可能在一个单独的问题中得到更好的解决,您可以在其中向我们展示您想要的 JSON。