Вот два способа, о которых я могу думать.
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>
</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>
</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
Спасибо, я изменил вариант 2, чтобы работать для меня. – kbreezy04