我正在尝试根据 Filemaker 数据库中的数据构建 xml 文件。使用 XSL 的 XML 基本结构没问题,但我在仅为特定元素添加属性时遇到了一个问题。 matchmode =“0”只能应用于“ref”元素,而不是“date”。
这是我得到的 XML:
<root>
<transportbookings>
<transportbooking>
<ref matchmode="0">260458</ref> *! ok*
<date matchmode="0">13-6-2023</date> *! not ok*
</transportbooking>
</transportbookings>
</root>
这是我创建的XLS:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fm="http://www.filemaker.com/fmpdsoresult" exclude-result-prefixes="fm">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="rename">
<item from="reference" to="ref" />
<item from="pu_date" to="date" />
</xsl:variable>
<xsl:template match="/*">
<root>
<xsl:apply-templates select="fm:ROW"/>
</root>
</xsl:template>
<xsl:template match="fm:ROW">
<transportbookings>
<transportbooking>
<xsl:apply-templates select="fm:reference | fm:pu_date" mode="rename" />
</transportbooking>
</transportbookings>
</xsl:template>
<xsl:template match="*" mode="rename">
<xsl:element name="{document('')//xsl:variable[@name = 'rename']/item[@from = local-name(current())]/@to}">
<xsl:attribute name="matchmode">0</xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>`
这是需要具备的:
<root>
<transportbookings>
<transportbooking>
<ref matchmode="0">260458</ref>
<date>13-6-2023</date> **! NO MATCHMODE**
</transportbooking>
</transportbookings>
</root>
我尝试了 if 语句,但无法让它工作。我想我把它变得复杂了还是?
这是 RAW XML。
0 DTS.fmp12 DTS_XML 122 260458
看来你可以简单地做:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fm="http://www.filemaker.com/fmpdsoresult"
exclude-result-prefixes="fm">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/FMPDSORESULT">
<root>
<xsl:apply-templates select="fm:ROW"/>
</root>
</xsl:template>
<xsl:template match="fm:ROW">
<transportbookings>
<transportbooking>
<xsl:apply-templates select="fm:reference | fm:pu_date"/>
</transportbooking>
</transportbookings>
</xsl:template>
<xsl:template match="fm:reference ">
<ref matchmode="0">
<xsl:value-of select="."/>
</ref>
</xsl:template>
<xsl:template match="fm:pu_date" ">
<date>
<xsl:value-of select="."/>
</date>
</xsl:template>
</xsl:stylesheet>
但是您没有给我们任何输入来进行测试。另请注意,这会为每个导出的记录创建
transportbookings
包装器。如果 - 正如您的示例所示 - 您仅导出一条记录,那么这可能会短得多。
我还建议您考虑使用
FMPXMLRESULT
语法进行导出。这将保护您的样式表免受字段名称更改的影响。