我有XML文件。我正试图为这个文件创建XSL,所以我为我的应用程序获得了另一个XML。现有XML文件的问题是它包含具有相同名称标记的字段。我只需要从这个XML中得到三个标记。由于标记的命名结构,创建XSL已经成为一个挑战。这是我的XML文件。
我正在编写这个XSL文件,我不确定我是否进入了正确的方向:
现有XML文件:
<?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获取这些标记:
这一领域的数量:
<Field FieldName="Sum ({STATION.Quantity}, {STATION.Item})" Name="Field24">
<FormattedValue>47</FormattedValue>
<Value>47.00</Value>
</Field>来自此字段的ItemId:
<Field FieldName="{STATION.Comments}" Name="Field23">
<FormattedValue>SWBP169-10</FormattedValue>
<Value>SWBP169-10</Value>
</Field>来自此字段的CustAccount:
<Field FieldName="{INVENTRY.Description2}" Name="Field7">
<FormattedValue>custaccount001</FormattedValue>
<Value>custaccount001</Value>
</Field>我正在创建的XSL文件:
<?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>预期产出:
<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字段。任何帮助到正确方向的人都会非常感激。
发布于 2019-07-26 20:54:29
您的方法的首要问题是XML位于命名空间中。您必须在样式表中声明相同的名称空间,为其分配一个前缀,并使用该前缀来处理源XML中的元素。否则,所有匹配和选择表达式都不会选择或匹配任何内容。
一旦你这样做,它应该是相当简单的。至少我认为是这样的--这个例子只有一条销售线,而且您所要求的输出不是很好的格式,所以很难确定。但这至少应该作为一个起点:
XSLT1.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">
<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>https://stackoverflow.com/questions/57226064
复制相似问题