【问题标题】:XSLT 1.0 - Use delimiter to split fields inside for-each loopXSLT 1.0 - 使用分隔符在 for-each 循环内拆分字段
【发布时间】:2019-08-01 17:52:24
【问题描述】:

我有一个需要转换的 XML 文件。我能够构建在第一个场景中没有分隔符的 XSLT 文件,但现在在第二个场景中,有一个分隔符 + 字段需要拆分为两个字段。

这是我的第二个场景中的源 XML;分隔符 + 在“Group/Group/Details/Section/Field/'FieldName='{STATION.Comments}'/value”字段上:

<?xml version="1.0" encoding="UTF-8"?>
<CrystalReport xmlns="urn:crystal-reports:schemas:report-detail" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:crystal-reports:schemas:report-detail http://www.businessobjects.com/products/xml/CR2008Schema.xsd">
   <Group Level="1">
      <GroupHeader>
         <Section SectionNumber="0">
            <Field FieldName="{STATION.Item}" Name="Field5">
               <FormattedValue>TR-BP169-10</FormattedValue>
               <Value>TR-BP169-10</Value>
            </Field>
            <Text Name="Text30">
               <TextValue>Item</TextValue>
            </Text>
            <Field FieldName="{INVENTRY.Description2}" Name="Field7">
                <FormattedValue>TRW Automotive</FormattedValue>
                <Value>TRW Automotive</Value>
            </Field>
         </Section>
      </GroupHeader>
      <Group Level="2">
         <Details Level="3">
            <Section SectionNumber="0">
               <Field FieldName="{STATION.Quantity}" Name="Field9">
                  <FormattedValue>11</FormattedValue>
                  <Value>11</Value>
               </Field>
               <Field FieldName="{STATION.Comments}" Name="Field23">
                    <FormattedValue>SWBP169-10</FormattedValue>
                    <Value>SWBP169-10+EA</Value>
                </Field>
            </Section>
         </Details>
      </Group>
      <GroupFooter>
         <Section SectionNumber="0">
            <Field FieldName="Sum ({STATION.Quantity}, {STATION.Item})" Name="Field24">
               <FormattedValue>47</FormattedValue>
               <Value>47.00</Value>
            </Field>
         </Section>
      </GroupFooter>
   </Group>
   <Group Level="1">
      <GroupHeader>
         <Section SectionNumber="0">
            <Field FieldName="{STATION.Item}" Name="Field5">
               <FormattedValue>TR-Y19CFC</FormattedValue>
               <Value>TR-Y19CFC</Value>
            </Field>
            <Text Name="Text30">
               <TextValue>Item</TextValue>
            </Text>
            <Field FieldName="{INVENTRY.Description2}" Name="Field7">
                <FormattedValue>TRW Automotive</FormattedValue>
                <Value>TRW Automotive</Value>
            </Field>
         </Section>
      </GroupHeader>
      <Group Level="2">
         <Details Level="3">
            <Section SectionNumber="0">
               <Field FieldName="{STATION.Quantity}" Name="Field9">
                  <FormattedValue>9</FormattedValue>
                  <Value>9</Value>
               </Field>
               <Field FieldName="{STATION.Comments}" Name="Field23">
                    <FormattedValue>Y19CFC</FormattedValue>
                    <Value>Y19CFC+EA</Value>
                </Field>
            </Section>
         </Details>
      </Group>
      <GroupFooter>
         <Section SectionNumber="0">
            <Field FieldName="Sum ({STATION.Quantity}, {STATION.Item})" Name="Field24">
               <FormattedValue>18</FormattedValue>
               <Value>18.00</Value>
            </Field>
         </Section>
      </GroupFooter>
   </Group>
</CrystalReport>

这是我的 XSLT 1.0 文件在第一个没有添加分隔符的场景中:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:cr="urn:crystal-reports:schemas:report-detail"
exclude-result-prefixes="cr msxsl cs"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:cs="urn:cs">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<msxsl:script language="C#" implements-prefix="cs">
<![CDATA[
    public string datenow()
    {
        return(DateTime.Now.ToString("yyyy'-'MM'-'dd"));
    }
    ]]>
</msxsl:script>

<xsl:template match="/cr:CrystalReport">
    <Envelope xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message">
        <Header>
            <Company>tgs</Company>
            <Action>http://schemas.microsoft.com/dynamics/2008/01/services/SalesOrderService/create</Action>
        </Header>
        <Body>
            <MessageParts>
                <SalesOrder xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder">
                        <SalesTable class="entity">
                            <CustAccount>                               
                                <xsl:value-of select="cr:Group/cr:GroupHeader/cr:Section/cr:Field[@FieldName='{INVENTRY.Description2}']/cr:Value"/>                             
                            </CustAccount>
                        <PurchOrderFormNum>PO</PurchOrderFormNum>
                        <ReceiptDateRequested><xsl:value-of select="cs:datenow()"/></ReceiptDateRequested>                  
                        <!-- sale lines -->                                             
                            <xsl:for-each select="cr:Group">
                                <SalesLine class="entity">                          
                                    <ItemId>
                                        <xsl:value-of select="cr:Group/cr:Details/cr:Section/cr:Field[@FieldName='{STATION.Comments}']/cr:Value"/>
                                    </ItemId>              
                                    <SalesQty>
                                        <xsl:value-of select="cr:GroupFooter/cr:Section/cr:Field[@FieldName='Sum ({STATION.Quantity}, {STATION.Item})']/cr:FormattedValue"/>                   
                                    </SalesQty> 
                                    <SalesUnit>EA</SalesUnit>                 
                                </SalesLine>
                            </xsl:for-each> 
                        </SalesTable>               
                </SalesOrder>
            </MessageParts>
        </Body>
    </Envelope>
</xsl:template>

</xsl:stylesheet>

这是使用分隔符的带有单独字段的所需输出。分隔符用于创建两个字段,一个用于 itemid,第二个用于 SalesUNIT:

<?xml version="1.0" encoding="UTF-8"?>
<Envelope xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message">
    <Header>
        <Company>tgs</Company>
        <Action>http://schemas.microsoft.com/dynamics/2008/01/services/SalesOrderService/create</Action>
    </Header>
    <Body>
        <MessageParts>
            <SalesOrder xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder">
                <SalesTable class="entity">
                    <CustAccount>TRW Automotive</CustAccount>
                    <PurchOrderFormNum>PO</PurchOrderFormNum>
                    <ReceiptDateRequested>2019-08-01</ReceiptDateRequested>
                    <SalesLine class="entity">
                        <ItemId>SWBP169-10</ItemId>
                        <SalesQty>47</SalesQty>
                        <SalesUnit>EA</SalesUnit>
                    </SalesLine>
                    <SalesLine class="entity">
                        <ItemId>Y19CFC</ItemId>
                        <SalesQty>18</SalesQty>
                        <SalesUnit>EA</SalesUnit>
                    </SalesLine>
                </SalesTable>
            </SalesOrder>
        </MessageParts>
    </Body>
</Envelope>

提前致谢。

【问题讨论】:

    标签: xml xslt-1.0


    【解决方案1】:

    如果源始终包含由+ 分隔的两个值,您可以使用以下方法提取第一个值:

    substring-before(Value, '+')
    

    第二个:

    substring-after(Value, '+')
    

    【讨论】:

    • 谢谢,这行得通,我不确定它是否那么容易使用子字符串。
    • 嗨,迈克尔,我还有其他问题。例如,如果项目 id 没有值/为空/null,并且我不希望该标记不在 XML 输出中显示,在这种情况下我可以使用什么?
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    相关资源
    最近更新 更多