用于给定 XML 结构的 XSLT(对于 CSV)

发布于 2024-11-05 09:08:09 字数 1219 浏览 0 评论 0原文

我不知道如何制作 XML 的 XSLT 将其转换为 CSV。请为给定的 XML 结构编写 XSLT 代码,并尝试验证并考虑所有原始逗号和引号等。

<DROPSHIPITEMS>
  <CREATED value="Thu Apr 21 23:17:39 BST 2011">
    <PRODUCT ITEM='8101'>
      <MODEL>FY316A</MODEL>
      <EAN>5055071647109</EAN>
      <NAME>Enchanted Twilight Flower Fairy 'Amethyst'</NAME>
      <DESCRIPTION><![CDATA[<p> Twilight Fairy 'Amethyst'</p><p>This, Fairy.</p>]]></DESCRIPTION>
      <DIMENSION><![CDATA[Height 31 - 32cm Width, 16 - 18.5cm Depth 12 - 13.5cm]]></DIMENSION>
      <PRICE>16.63</PRICE>
      <DELIVERY>I</DELIVERY>
      <QUANTITY>224</QUANTITY>
      <MIN_ORDER_QTY>1</MIN_ORDER_QTY>
      <URL>http://www.abc-dropship.co.uk/gifts/product_info.php?products_id=8101</URL>
      <IMAGE_URL>http://www.abc-dropship.co.uk/gifts/images/FY316A_001.jpg</IMAGE_URL>
      <CATEGORIES>9003|100297</CATEGORIES>
      <OPTIONS><![CDATA[B - Hand on Dress|A - Flower in Hand|Any]]></OPTIONS>
    </PRODUCT>
</CREATED>
</DROPSHIPITEMS>

谢谢

I don't know how to make an XSLT for XML to convert it to CSV. Please code a XSLT for the given structure of XML and try to validate and consider the all original commas and quotes etc.

<DROPSHIPITEMS>
  <CREATED value="Thu Apr 21 23:17:39 BST 2011">
    <PRODUCT ITEM='8101'>
      <MODEL>FY316A</MODEL>
      <EAN>5055071647109</EAN>
      <NAME>Enchanted Twilight Flower Fairy 'Amethyst'</NAME>
      <DESCRIPTION><![CDATA[<p> Twilight Fairy 'Amethyst'</p><p>This, Fairy.</p>]]></DESCRIPTION>
      <DIMENSION><![CDATA[Height 31 - 32cm Width, 16 - 18.5cm Depth 12 - 13.5cm]]></DIMENSION>
      <PRICE>16.63</PRICE>
      <DELIVERY>I</DELIVERY>
      <QUANTITY>224</QUANTITY>
      <MIN_ORDER_QTY>1</MIN_ORDER_QTY>
      <URL>http://www.abc-dropship.co.uk/gifts/product_info.php?products_id=8101</URL>
      <IMAGE_URL>http://www.abc-dropship.co.uk/gifts/images/FY316A_001.jpg</IMAGE_URL>
      <CATEGORIES>9003|100297</CATEGORIES>
      <OPTIONS><![CDATA[B - Hand on Dress|A - Flower in Hand|Any]]></OPTIONS>
    </PRODUCT>
</CREATED>
</DROPSHIPITEMS>

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一身仙ぐ女味 2024-11-12 09:08:09

试试这个:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:for-each select="*/*/*[1]/*">
      <xsl:value-of select="name()" />
      <xsl:if test="not(position() = last())">,</xsl:if>
    </xsl:for-each>
    <xsl:text>
</xsl:text>
    <xsl:apply-templates select="*/*/*" mode="row"/>
  </xsl:template>

  <xsl:template match="*" mode="row">
    <xsl:apply-templates select="*" mode="data" />
    <xsl:text>
</xsl:text>
  </xsl:template>

  <xsl:template match="*" mode="data">
    <xsl:choose>
      <xsl:when test="contains(text(),',')">
        <xsl:text>"</xsl:text>
        <xsl:call-template name="doublequotes">
          <xsl:with-param name="text" select="text()" />
        </xsl:call-template>
        <xsl:text>"</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="." />
      </xsl:otherwise>
    </xsl:choose>
    <xsl:if test="position() != last()">,</xsl:if>
  </xsl:template>

  <xsl:template name="doublequotes">
    <xsl:param name="text" />
    <xsl:choose>
      <xsl:when test="contains($text,'"')">
        <xsl:value-of select="concat(substring-before($text,'"'),'""')" />
        <xsl:call-template name="doublequotes">
          <xsl:with-param name="text" select="substring-after($text,'"')" />
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$text" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

它可以正确处理带逗号的字段和带双引号的字段。

编辑:差点忘了;该模板添加了一个带有字段名称的标题行。如果您不需要,第一个模板只需

  <xsl:template match="/">
    <xsl:apply-templates select="*/*/*" mode="row"/>
  </xsl:template>

Try this:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:for-each select="*/*/*[1]/*">
      <xsl:value-of select="name()" />
      <xsl:if test="not(position() = last())">,</xsl:if>
    </xsl:for-each>
    <xsl:text>
</xsl:text>
    <xsl:apply-templates select="*/*/*" mode="row"/>
  </xsl:template>

  <xsl:template match="*" mode="row">
    <xsl:apply-templates select="*" mode="data" />
    <xsl:text>
</xsl:text>
  </xsl:template>

  <xsl:template match="*" mode="data">
    <xsl:choose>
      <xsl:when test="contains(text(),',')">
        <xsl:text>"</xsl:text>
        <xsl:call-template name="doublequotes">
          <xsl:with-param name="text" select="text()" />
        </xsl:call-template>
        <xsl:text>"</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="." />
      </xsl:otherwise>
    </xsl:choose>
    <xsl:if test="position() != last()">,</xsl:if>
  </xsl:template>

  <xsl:template name="doublequotes">
    <xsl:param name="text" />
    <xsl:choose>
      <xsl:when test="contains($text,'"')">
        <xsl:value-of select="concat(substring-before($text,'"'),'""')" />
        <xsl:call-template name="doublequotes">
          <xsl:with-param name="text" select="substring-after($text,'"')" />
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$text" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

It correctly handles fields with a comma, and fields with double quotes as well.

EDIT: Almost forgot; this template adds a header line with field names in. If you don't need that, the first template just needs to be

  <xsl:template match="/">
    <xsl:apply-templates select="*/*/*" mode="row"/>
  </xsl:template>
蝶…霜飞 2024-11-12 09:08:09

将 XML 转换为逗号分隔与任何其他转换相同。以下按原样重现字段,除非它们在您仍然需要处理的每个产品中的顺序相同。该示例将帮助您入门:

  <xsl:output method="text"/>

  <xsl:template match="//PRODUCT">
        <xsl:value-of select="@ITEM" />
    <xsl:text>,</xsl:text>
    <xsl:apply-templates select="./*" />
    <xsl:text>
</xsl:text>
  </xsl:template>

  <xsl:template match="PRODUCT/*">
        <xsl:value-of select="translate(text(), ',', '@')" />
    <xsl:text>,</xsl:text>
  </xsl:template>

顺便说一句,�A; 添加换行符,对于 dos/windows,您可能还需要添加 �D;

更新:值中的逗号可以通过使用 translate() 函数将其替换为另一个字符来转义。

To convert the XML to comma delimeted is just the same as any other transformation. The following reproduces the fields as-is so unless they are in the same order in every PRODUCT you need to handle that still. The example will get you started:

  <xsl:output method="text"/>

  <xsl:template match="//PRODUCT">
        <xsl:value-of select="@ITEM" />
    <xsl:text>,</xsl:text>
    <xsl:apply-templates select="./*" />
    <xsl:text>
</xsl:text>
  </xsl:template>

  <xsl:template match="PRODUCT/*">
        <xsl:value-of select="translate(text(), ',', '@')" />
    <xsl:text>,</xsl:text>
  </xsl:template>

Btw, the �A; adds a newline, for dos/windows you might need to add a �D; too.

Update: commas in values can be escaped by replacing them with another character using the translate() function.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文