繁体   English   中英

使用XSLT的XML模板转换输出

[英]Template Transform Output of XML with XSLT

我已经有了要转换的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> 

您能提供的任何帮助将不胜感激! 谢谢。

请求的输出可以通过以下方式获得:

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>

笔记:

  1. 将“ METADATA”部分中的字段名称更改为您的首选项; 如果使它们与目标解决方案中的字段名称相同,则可以在设置导入映射时使用“匹配名称”选项。
  2. 假设您使用的是FileMaker 11版或更高版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM