如何仅为 Filemaker 数据提取的 XML 中的特定元素指定 XSL 属性

问题描述 投票:0回答:1

我正在尝试根据 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 13-6-2023

xml xslt attributes filemaker
1个回答
0
投票

看来你可以简单地做:

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
语法进行导出。这将保护您的样式表免受字段名称更改的影响。

© www.soinside.com 2019 - 2024. All rights reserved.