XML в текст с форматированием - PullRequest
1 голос
/ 06 августа 2009

У меня есть XML-файл как:

<Order>
  <EP>
  <Name>Generation Date</Name>
  <Value>2009-08-04+05:30</Value>
  </EP>
  <EP>
  <Name>NoOfRecords</Name>
  <Value>100</Value>
  </EP>
 <OrderLineItems>
   <OrderLineItem OrderDateTime="2007-01-01T17:09:04.593+05:30>
   <Customer>
      <FullName>Mrs S </FulName>
   <Address>
     <AddressLine1>ABC</AddressLine1>
     <AddressLine2>XYZ</AddressLine2>
   </Address>
   </Customer>
   <EP>
      <Name>DealerAccount</Name>
      <Value>00000000000</Value>
   </EP>
 </OrderLineItem>
 </OrderLineItems>
</Order>

Где повторяется тег OrderLineItem. Теперь я хочу преобразовать этот xml в текстовый файл, используя xslt. Формат плоского файла фиксирован и выглядит следующим образом:

00000000000010107     Mrs S       ABC  XYZ 
00000000000150709     Mr x        PQR  TWR

, где первый столбец содержит поле Dealeraccount и orderDate (время удалено), второе - это имя, а третье и четвертое поля - это адресная строка 1 и адресная строка2 соответственно. Обратите внимание, что форматирование текстового файла является обязательным, и у меня также есть длина каждого поля, например, длина имени varchar2 (50) и т. Д.

Ответы [ 2 ]

1 голос
/ 07 августа 2009

Ну наконец-то я понял ... вот решение

<xsl:template name="ColumnSeparator">
        <xsl:param name="count" select="1"/>
        <xsl:param name="separator" select="' '"/>
        <xsl:if test="$count > 0">
            <xsl:value-of select="$separator"/>
            <xsl:call-template name="ColumnSeparator">
                <xsl:with-param name="count" select="$count - 1"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>

А затем просто вызовите этот шаблон, используя:

<xsl:call-template name="ColumnSeparator">
                <xsl:with-param name="count" select="50-string-length(Customer/FullName)"/>
            </xsl:call-template>
0 голосов
/ 06 августа 2009

Что-то вроде этого должно работать - для точного форматирования вам нужно настроить части <xsl:text> - добавить больше пробелов или других разделителей:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">

  <xsl:output method="text" indent="no"/>

  <xsl:template match="Order">
    <xsl:apply-templates select="OrderLineItems/OrderLineItem" />
  </xsl:template>

  <xsl:template match="OrderLineItem">
    <xsl:value-of select="EP/Value"/>
    <xsl:text>              </xsl:text>
    <xsl:value-of select="Customer/FullName"/>
    <xsl:text>     </xsl:text>
    <xsl:value-of select="Customer/Address/AddressLine1"/>
    <xsl:text>     </xsl:text>
    <xsl:value-of select="Customer/Address/AddressLine2"/>
    <xsl:text>
    </xsl:text>
  </xsl:template>
</xsl:stylesheet>

Вы не можете сделать намного больше с точки зрения форматирования необработанного текста в XSLT - к сожалению, он действительно весьма ограничен.

Марк

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