首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用预期的XML从XML创建XSL文件

用预期的XML从XML创建XSL文件
EN

Stack Overflow用户
提问于 2019-07-26 19:33:42
回答 1查看 116关注 0票数 0

我有XML文件。我正试图为这个文件创建XSL,所以我为我的应用程序获得了另一个XML。现有XML文件的问题是它包含具有相同名称标记的字段。我只需要从这个XML中得到三个标记。由于标记的命名结构,创建XSL已经成为一个挑战。这是我的XML文件。

我正在编写这个XSL文件,我不确定我是否进入了正确的方向:

现有XML文件:

代码语言:javascript
复制
<?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>custaccount001</FormattedValue>
                <Value>custaccount001</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</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>
</CrystalReport>

我需要从上面的XML获取这些标记:

这一领域的数量:

代码语言:javascript
复制
            <Field FieldName="Sum ({STATION.Quantity}, {STATION.Item})" Name="Field24">
               <FormattedValue>47</FormattedValue>
               <Value>47.00</Value>
            </Field>

来自此字段的ItemId:

代码语言:javascript
复制
               <Field FieldName="{STATION.Comments}" Name="Field23">
                    <FormattedValue>SWBP169-10</FormattedValue>
                    <Value>SWBP169-10</Value>
                </Field>

来自此字段的CustAccount:

代码语言:javascript
复制
            <Field FieldName="{INVENTRY.Description2}" Name="Field7">
                <FormattedValue>custaccount001</FormattedValue>
                <Value>custaccount001</Value>
            </Field>

我正在创建的XSL文件:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet exclude-result-prefixes="msxsl" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes" method="xml"/>
<xsl:template match="/">
<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 xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message">
<SalesOrder xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder">
<SalesTable class="entity">
<xsl:for-each select="CrystalReport/Group/GroupHeader/Section">
    <CustAccount><xsl:value-of select="??"/></CustAccount>
<PurchOrderFormNum>PO</PurchOrderFormNum>
</xsl:for-each>
<xsl:for-each select="CrystalReport/Group/Group/Details/Section/Field">
    <SalesLine class="entity">
        <ItemId><xsl:value-of select="??"/></ItemId>
    </SalesLine>
</xsl:for-each>
<xsl:for-each select="CrystalReport/Group/GroupFooter/Section/Field">
    <SalesLine class="entity">
        <Qty><xsl:value-of select="??"></Qty>
</xsl:for-each>
</SalesTable>
</SalesOrder>
</MessageParts>
</Body>
</Envelope>
</xsl:template>
</xsl:stylesheet>

预期产出:

代码语言:javascript
复制
<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>custaccount001</CustAccount>
               <PurchOrderFormNum>PO</PurchOrderFormNum>
               <SalesLine class="entity">
                  <ItemId>SWBP169-10</ItemId>              
                  <SalesQty>11</SalesQty>                  
               </SalesLine>
            </SalesTable>
         </SalesOrder>
      </MessageParts>
   </Body>
</Envelope>

我不确定需要做什么才能得到ItemID,Cust帐户,Qty字段。任何帮助到正确方向的人都会非常感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-26 20:54:29

您的方法的首要问题是XML位于命名空间中。您必须在样式表中声明相同的名称空间,为其分配一个前缀,并使用该前缀来处理源XML中的元素。否则,所有匹配和选择表达式都不会选择或匹配任何内容。

一旦你这样做,它应该是相当简单的。至少我认为是这样的--这个例子只有一条销售线,而且您所要求的输出不是很好的格式,所以很难确定。但这至少应该作为一个起点:

XSLT1.0

代码语言:javascript
复制
<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">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<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>
                        <!-- sale lines -->
                        <xsl:for-each select="cr:Group/cr:Group/cr:Details/cr:Section">
                            <SalesLine class="entity">
                                <ItemId>
                                    <xsl:value-of select="cr:Field[@FieldName='{STATION.Comments}']/cr:Value"/>
                                </ItemId>              
                                <SalesQty>
                                    <xsl:value-of select="cr:Field[@FieldName='{STATION.Quantity}']/cr:Value"/>                   
                                </SalesQty>                  
                            </SalesLine>
                        </xsl:for-each>
                    </SalesTable>
                </SalesOrder>
            </MessageParts>
        </Body>
    </Envelope>
</xsl:template>

</xsl:stylesheet>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57226064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档