【问题标题】:Parsing string inside XML element into CSV using XSLT使用 XSLT 将 XML 元素内的字符串解析为 CSV
【发布时间】:2017-08-28 04:07:36
【问题描述】:

我是 XSLT 的新手,希望能就以下问题提供一些帮助:

我有包含有关包的串联信息的 XML。我需要使用 XSLT 将它们解析为 CSV(分隔符是分号)。我需要为所有连接的项目生成单独的行,因此还需要一些 for-each 循环。

XML 如下所示:

<Package>
    <Content>Goodies</Content>
    <Weight>TotalWeight</Weight>
    <Dimensions>Lenght1/Width1/Height1/Weight1,Lenght2/Width2/Height2/Weight2</Dimensions>
    <PackingType>Pallet</PackingType>
</Package>

所需的输出如下所示:

1;Goodies;TotalWeight;Length1;Width1;Height1;Weight1;Pallet 2;Goodies;TotalWeight;Length2;Width2;Height2;Weight2;Pallet

这应该使用 XSLT 1.0 来完成(是的,我们有一些限制)。

提前致谢!

【问题讨论】:

  • 搜索“tokenize”。

标签: xml csv xslt


【解决方案1】:

试试这样的:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

  <xsl:template match="Package">
    <xsl:call-template name="row">
      <xsl:with-param name="pack" select="."/>
      <xsl:with-param name="str" select="Dimensions"/>
      <xsl:with-param name="nn" select="1"/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="row">
    <xsl:param name="pack"/>
    <xsl:param name="str"/>
    <xsl:param name="nn"/>
    <xsl:variable name="s1" select="substring-before($str, ',')"/>
    <xsl:if test="$s1">
      <xsl:variable name="s2" select="substring-after($str, ',')"/>
      <xsl:call-template name="rowInternal">
        <xsl:with-param name="pack" select="$pack"/>
        <xsl:with-param name="str" select="$s1"/>
        <xsl:with-param name="nn" select="$nn"/>
      </xsl:call-template>
      <xsl:call-template name="row">
        <xsl:with-param name="pack" select="$pack"/>
        <xsl:with-param name="str" select="$s2"/>
        <xsl:with-param name="nn" select="$nn+1"/>
      </xsl:call-template>
    </xsl:if>
    <xsl:if test="not($s1) and $str">
      <xsl:call-template name="rowInternal">
        <xsl:with-param name="pack" select="$pack"/>
        <xsl:with-param name="str" select="$str"/>
        <xsl:with-param name="nn" select="$nn"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>

  <xsl:template name="rowInternal">
    <xsl:param name="pack"/>
    <xsl:param name="str"/>
    <xsl:param name="nn"/>
    <xsl:value-of select="$nn"/>
    <xsl:text>;</xsl:text>
    <xsl:value-of select="$pack/Content"/>
    <xsl:text>;</xsl:text>
    <xsl:value-of select="$pack/Weight"/>
    <xsl:text>;</xsl:text>
    <xsl:value-of select="translate($str, '/', ';')"/>
    <xsl:text>;</xsl:text>
    <xsl:value-of select="$pack/PackingType"/>
    <xsl:text>&#xA;</xsl:text>
  </xsl:template>

</xsl:transform>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    相关资源
    最近更新 更多