我有这个XML,我正在尝试转换,我很难在我的XSLT中需要改变什么来实现所需的输出。
我要挂断的地方是如何编写模板以包含来自../Deliverables/Deliverable/Name的数据。
以下是XML
的摘录
<?xml version="1.0" encoding="UTF-8" ?>
<Projects>
<Project>
<ProjectNum>P-999999</ProjectNum>
<Name>
<![CDATA[EXAMPLE PROJECT XYZ]]>
</Name>
<Tasks>
<Task>
<Deliverables>
<Deliverable>
<Name>
<![CDATA[X-12345]]>
</Name>
<Product>
<ProductCode>
<![CDATA[123456]]>
<Package>
<![CDATA[CASE]]>
<UUID>
<![CDATA[037XXXXXX21]]>
</UUID>
</Package>
</ProductCode>
<ProductCode>
<![CDATA[222333]]>
<Package>
<![CDATA[ITEM]]>
<UUID>
<![CDATA[000XXXXXX52723]]>
</UUID>
</Package>
</ProductCode>
</Product>
</Deliverable>
</Deliverables>
</Task>
<Task>
<Deliverables>
<Deliverable>
<Name>
<![CDATA[Y-12345]]>
</Name>
<Product>
<ProductCode>
<![CDATA[78910]]>
<Package>
<![CDATA[BOX]]>
<UUID>
<![CDATA[123XXXXXX45]]>
</UUID>
</Package>
</ProductCode>
<ProductCode>
<![CDATA[4444555]]>
<Package>
<![CDATA[PALLET]]>
<UUID>
<![CDATA[678XXXXXX91011]]>
</UUID>
</Package>
</ProductCode>
</Product>
</Deliverable>
</Deliverables>
</Task>
</Tasks>
</Project>
</Projects>
以下是转换的XSLT
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="/">
<FMPXMLRESULT>
<RESULTSET>
<xsl:apply-templates select="node() | @*" />
</RESULTSET>
</FMPXMLRESULT>
</xsl:template>
<xsl:template match="ProductCode">
<ROW>
<xsl:call-template name="fpc" />
</ROW>
</xsl:template>
<xsl:template name="fpc">
<COL>
<DATA>
<xsl:value-of select="normalize-space(./text())" />
</DATA>
</COL>
<xsl:for-each select="child::*">
<xsl:call-template name="fpc" />
</xsl:for-each>
</xsl:template>
<xsl:template match="Tasks/Task">
<COL>
<DATA>
<xsl:value-of select="./Deliverables/Deliverable/Name" />
</DATA>
</COL>
<xsl:for-each select=".">
<xsl:call-template name="fpc" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
以下是我需要输出的内容
<?xml version="1.0" encoding="UTF-8" ?>
<RESULTSET>
<ROW>
<COL>
<DATA>X-12345</DATA>
</COL>
<COL>
<DATA>123456</DATA>
</COL>
<COL>
<DATA>CASE</DATA>
</COL>
<COL>
<DATA>037XXXXXX21</DATA>
</COL>
</ROW>
<ROW>
<COL>
<DATA>X-12345</DATA>
</COL>
<COL>
<DATA>222333</DATA>
</COL>
<COL>
<DATA>ITEM</DATA>
</COL>
<COL>
<DATA>000XXXXXX52723</DATA>
</COL>
</ROW>
<ROW>
<COL>
<DATA>Y-12345</DATA>
</COL>
<COL>
<DATA>78910</DATA>
</COL>
<COL>
<DATA>BOX</DATA>
</COL>
<COL>
<DATA>123XXXXXX45</DATA>
</COL>
</ROW>
<ROW>
<COL>
<DATA>Y-12345</DATA>
</COL>
<COL>
<DATA>4444555</DATA>
</COL>
<COL>
<DATA>PALLET</DATA>
</COL>
<COL>
<DATA>678XXXXXX91011</DATA>
</COL>
</ROW>
</RESULTSET>
您可以提供的任何帮助将非常感谢!谢谢。
答案 0 :(得分:0)
请求的输出可以通过以下方式获得:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="/Projects">
<RESULTSET>
<xsl:for-each select="Project/Tasks/Task/Deliverables/Deliverable/Product/ProductCode">
<ROW>
<COL>
<DATA><xsl:value-of select="normalize-space(ancestor::Deliverable/Name)"/></DATA>
</COL>
<COL>
<DATA><xsl:value-of select="normalize-space(text())"/></DATA>
</COL>
<COL>
<DATA><xsl:value-of select="normalize-space(Package/text())"/></DATA>
</COL>
<COL>
<DATA><xsl:value-of select="normalize-space(Package/UUID)"/></DATA>
</COL>
</ROW>
</xsl:for-each>
</RESULTSET>
</xsl:template>
</xsl:stylesheet>
注意:
如果您尝试生成适合导入FileMaker的结果,则不是这样。
是的,转换需要适合FileMaker。我该怎么办 在样式表中有不同的方法吗?
要使输出符合FileMaker的FMPXMLRESULT模式,您需要添加一个描述字段的METADATA部分,将整个内容括在FMPXMLRESULT
标记中,并将其放在FileMaker的命名空间中:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="/Projects">
<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
<METADATA>
<FIELD NAME="Name"/>
<FIELD NAME="ProductCode"/>
<FIELD NAME="Package"/>
<FIELD NAME="UUID"/>
</METADATA>
<RESULTSET>
<xsl:for-each select="Project/Tasks/Task/Deliverables/Deliverable/Product/ProductCode">
<ROW>
<COL>
<DATA><xsl:value-of select="normalize-space(ancestor::Deliverable/Name)"/></DATA>
</COL>
<COL>
<DATA><xsl:value-of select="normalize-space(text())"/></DATA>
</COL>
<COL>
<DATA><xsl:value-of select="normalize-space(Package/text())"/></DATA>
</COL>
<COL>
<DATA><xsl:value-of select="normalize-space(Package/UUID)"/></DATA>
</COL>
</ROW>
</xsl:for-each>
</RESULTSET>
</FMPXMLRESULT>
</xsl:template>
</xsl:stylesheet>
备注:强>