大家好,
希望您可以在以下方面为我提供帮助。我对XML有点了解,通过反复试验并阅读Stack Overflow上的项目,我设法创建了一个有效的XSLT。 唯一不起作用的是在项目ID(AI0567)旁边获得项目描述(“ BlaBla”)。因此,此描述必须出现在“ ns0:CarrierContent”行的级别上。
这里的问题(?)是描述不是孩子,而是同一级别。有人知道这是否可能吗?预先谢谢你!
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<ns0:Message xmlns:ns0="####">
<ns0:Header>
</ns0:Header>
<ns0:Customers>
<ns0:Customer>
<ns0:Carriers>
<ns0:Carrier>
<ns0:ContentLines>
<ns0:CarrierContent>
<ns0:CustomerItemNo>AI0567</ns0:CustomerItemNo>
</ns0:CarrierContent>
</ns0:ContentLines>
</ns0:Carrier>
</ns0:Carriers>
<ns0:Items>
<ns0:Item>
<ns0:No>AI0567</ns0:No>
<ns0:Description>BlaBla</ns0:Description>
</ns0:Item>
</ns0:Items>
</ns0:Customer>
</ns0:Customers>
</ns0:Message>
XSLT:
<?xml version="1.0" encoding="utf-8"?>
<?mso-application progid=”Excel.Sheet”?>
<xsl:stylesheet version="2.0"
xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:ns0="###">
<xsl:template match="/">
<xsl:processing-instruction name="mso-application">
<xsl:text>progid="Excel.Sheet"</xsl:text>
</xsl:processing-instruction>
<Workbook>
<Worksheet ss:Name="Page1">
<Table>
<xsl:call-template name="XMLToXSL" />
</Table>
</Worksheet>
</Workbook>
</xsl:template>
<xsl:template name="XMLToXSL">
<xsl:processing-instruction name="mso-application">
<xsl:text>progid="Excel.Sheet"</xsl:text>
</xsl:processing-instruction>
<xsl:key name="DescriptionSearch" match="ns0:Message/ns0:Customers/ns0:Customer/ns0:Items/ns0:Item" use="@ns0:Message/ns0:Customers/ns0:Customer/ns0:Items/ns0:Item/ns0:No" />
<xsl:for-each select="/">
<Row>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="ns0:Message/ns0:Customers/ns0:Customer/ns0:Carriers/ns0:Carrier/ns0:ContentLines/ns0:CarrierContent/ns0:CustomerItemNo" />
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="ns0:Message/ns0:Customers/ns0:Customer/ns0:Carriers/ns0:Carrier/ns0:ContentLines/ns0:CarrierContent/ns0:ExternalCustomerItemNo" />
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="key('DescriptionSearch',@ns0:Message/ns0:Customers/ns0:Customer/ns0:Carriers/ns0:Carrier/ns0:ContentLines/ns0:CarrierContent/ns0:CustomerItemNo)" />
</Data>
</Cell>
</Row>
</xsl:for-each>
</xsl:template>
<xsl:template match="/ns0:Message">
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:0)
xsl:key
的定义存在很多问题
xsl:key
必须是xsl:stylesheet
的直接子代,而不是xsl:template
内的@
开头,表示属性,但ns0:message
不是属性(如果是,则后面没有子元素)这意味着您的xsl:key
应该看起来像这样
<xsl:key name="DescriptionSearch" match="ns0:Message/ns0:Customers/ns0:Customer/ns0:Items/ns0:Item" use="ns0:No" />
实际上,在这种情况下,您可以将其简化为此,因为您不需要指定匹配的完整路径(除非除非其他地方的项目具有不需要的匹配路径,否则不可以)< / p>
<xsl:key name="DescriptionSearch" match="ns0:Item" use="ns0:No" />
关于使用密钥,您的表达式需要是这样(再次注意如何删除@
的用法)
<xsl:value-of select="key('DescriptionSearch',ns0:Message/ns0:Customers/ns0:Customer/ns0:Carriers/ns0:Carrier/ns0:ContentLines/ns0:CarrierContent/ns0:CustomerItemNo)/ns0:Description" />
所以,您的XSLT可能看起来像这样...
<xsl:stylesheet version="2.0"
xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:ns0="####">
<xsl:key name="DescriptionSearch" match="ns0:Item" use="ns0:No" />
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<xsl:processing-instruction name="mso-application">
<xsl:text>progid="Excel.Sheet"</xsl:text>
</xsl:processing-instruction>
<Workbook>
<Worksheet ss:Name="Page1">
<Table>
<xsl:call-template name="XMLToXSL" />
</Table>
</Worksheet>
</Workbook>
</xsl:template>
<xsl:template name="XMLToXSL">
<xsl:for-each select="/">
<Row>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="ns0:Message/ns0:Customers/ns0:Customer/ns0:Carriers/ns0:Carrier/ns0:ContentLines/ns0:CarrierContent/ns0:CustomerItemNo" />
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="ns0:Message/ns0:Customers/ns0:Customer/ns0:Carriers/ns0:Carrier/ns0:ContentLines/ns0:CarrierContent/ns0:ExternalCustomerItemNo" />
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="key('DescriptionSearch',ns0:Message/ns0:Customers/ns0:Customer/ns0:Carriers/ns0:Carrier/ns0:ContentLines/ns0:CarrierContent/ns0:CustomerItemNo)/ns0:Description" />
</Data>
</Cell>
</Row>
</xsl:for-each>
</xsl:template>
<xsl:template match="/ns0:Message">
</xsl:template>
</xsl:stylesheet>
但是我可能会将最终模板简化为这个模板(因为这可能导致您的XML可能包含多个客户的情况
<xsl:template name="XMLToXSL">
<xsl:for-each select="/ns0:Message/ns0:Customers/ns0:Customer/ns0:Carriers/ns0:Carrier/ns0:ContentLines/ns0:CarrierContent">
<Row>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="ns0:CustomerItemNo" />
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="ns0:ExternalCustomerItemNo" />
</Data>
</Cell>
<Cell>
<Data ss:Type="String">
<xsl:value-of select="key('DescriptionSearch', ns0:CustomerItemNo)/ns0:Description" />
</Data>
</Cell>
</Row>
</xsl:for-each>
</xsl:template>
<xsl:template match="/ns0:Message">
</xsl:template>