模板使用XSLT转换XML输出

时间:2016-01-15 18:38:44

标签: xml 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>

您可以提供的任何帮助将非常感谢!谢谢。

1 个答案:

答案 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>

备注:

  1. 将METADATA部分中的字段名称更改为您的首选项; 如果你使它们与目标中的字段名称相同 解决方案,您将能够使用&#34;匹配的名称&#34;选项何时 设置导入地图。
  2. 这假设您使用的是FileMaker版本11或更高版本。