2013-07-11 2 views
1

Я использую XSLT для преобразования xml в текстовый файл с разделителем слэш. В части моего XML нужно создать следующее:Как заполнить пустое пространство XSLT?

HEADING 
/1 /2     /3  /4  /5 /6  /7 
/data /data    /data /dat /1/data  /data 

Где есть заголовок и номера заголовки столбцов с рядами данных внизу. Интервал между каждым столбцом должен быть одинаковым, но данные могут иметь длину, меньшую необходимого пространства между столбцами. Я использую это, чтобы получить значение:

<xsl:value-of select="package_identification"/> 

Что я могу сделать, чтобы заполнить оставшееся пространство пробелами?

ответ

1

Вот два способа, о которых я могу думать.

XML-вход

<test> 
    <row> 
     <entry>data</entry> 
     <entry>dataaaa</entry> 
     <entry>data</entry>  
    </row> 
    <row> 
     <entry>datadata</entry> 
     <entry>datad</entry> 
     <entry>da</entry>  
    </row> 
</test> 

Первый XSLT-2,0

Это использует буквенные пространства для представления ширину столбца. Он также использует substring() сдирать, что это не нужно ...

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:variable name="colwidths" as="element()"> 
     <colwidths> 
      <col val="     "/>     
      <col val="   "/> 
      <col val="      "/>       
     </colwidths> 
    </xsl:variable> 

    <xsl:template match="row"> 
     <xsl:apply-templates/> 
     <xsl:text>&#xA;</xsl:text> 
    </xsl:template> 

    <xsl:template match="entry"> 
     <xsl:variable name="currPos" select="position()"/> 
     <xsl:value-of select="concat('/',.,substring($colwidths/col[$currPos]/@val,string-length(.)))"/> 
    </xsl:template> 

</xsl:stylesheet> 

Второй XSLT 2.0

Это аналогично, но использует цифры для обозначения ширины столбца и использует xsl:for-each для вывода на пространства необходимо ...

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:variable name="colwidths" as="element()"> 
     <colwidths> 
      <col val="17"/>     
      <col val="9"/> 
      <col val="23"/>       
     </colwidths> 
    </xsl:variable> 

    <xsl:template match="row"> 
     <xsl:apply-templates/> 
     <xsl:text>&#xA;</xsl:text> 
    </xsl:template> 

    <xsl:template match="entry"> 
     <xsl:variable name="currPos" select="position()"/> 
     <xsl:value-of select="concat('/',.)"/> 
     <xsl:for-each select="0 to xs:integer($colwidths/col[$currPos]/@val - string-length(.))"> 
      <xsl:text> </xsl:text> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

Оба они производят следующий вывод:

/data    /dataaaa /data      
/datadata   /datad  /da      
+0

Спасибо, я изменил вариант 2, чтобы работать для меня. – kbreezy04

0

Если вы можете использовать EXSLT, используйте Обл: функцию обивки: http://www.exslt.org/str/functions/padding/index.html

Предполагая, что вы хотели столбец 10 символов в ширине, отработка вашей линии XSLT:

<xsl:value-of select="package_identification"/> 
<xsl:value-of select="str:padding(10 - string-length(package_identification))"/> 

Убедитесь в том, declare xmlns: str = "http://exslt.org/strings", желательно в элементе xsl: stylesheet.

Если вы не можете использовать EXSLT, а затем определить рекурсивный шаблон утеплитель:

<xsl:template name="padding"> 
    <xsl:param name="length"/> 
    <xsl:param name="string" select="' '"/> 
    <xsl:value-of select="$string"/> 
    <xsl:if test="$length > 1"> 
    <xsl:call-template name="padding"> 
     <xsl:with-param name="length" select="$length - 1"/> 
     <xsl:with-param name="string" select="$string"/> 
    </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

Затем использовать его как это:

<xsl:value-of select="package_identification"/> 
<xsl:call-template name="padding"> 
    <xsl:with-param name="length" select="10 - string-length(package_identification)"/> 
</xsl:call-template> 
Смежные вопросы