XSLT (для CSV) для данной структуры XML - PullRequest
2 голосов
/ 04 мая 2011

Я не знаю, как сделать XSLT для XML, чтобы преобразовать его в CSV. Пожалуйста, код XSLT для данной структуры XML и попытаться проверить и рассмотреть все оригинальные запятые и кавычки и т. Д.

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 04 мая 2011

Попробуйте:

<?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>&#10;</xsl:text>
    <xsl:apply-templates select="*/*/*" mode="row"/>
  </xsl:template>

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

  <xsl:template match="*" mode="data">
    <xsl:choose>
      <xsl:when test="contains(text(),',')">
        <xsl:text>&quot;</xsl:text>
        <xsl:call-template name="doublequotes">
          <xsl:with-param name="text" select="text()" />
        </xsl:call-template>
        <xsl:text>&quot;</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,'&quot;')">
        <xsl:value-of select="concat(substring-before($text,'&quot;'),'&quot;&quot;')" />
        <xsl:call-template name="doublequotes">
          <xsl:with-param name="text" select="substring-after($text,'&quot;')" />
        </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>
1 голос
/ 04 мая 2011

Преобразовать XML в разделенный запятыми так же, как и любое другое преобразование.Следующее воспроизводит поля «как есть», если только они не находятся в одинаковом порядке в каждом ПРОДУКТЕ, который необходимо обработать до сих пор.Пример поможет вам начать:

  <xsl:output method="text"/>

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

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

Кстати, &#0A; добавляет новую строку, для дос / окон вам может понадобиться добавить также &#0D;.

Обновление : запятые в значениях можно экранировать, заменив их другим символом с помощью функции translate().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...