我正在使用XSLT将xml转换为斜杠分隔的文本文件。在我的部分xml中,我需要创建以下内容:
HEADING
/1 /2 /3 /4 /5 /6 /7
/data /data /data /dat / 1/data /data
如果有标题,则数字是列标题,下面是数据行。每列之间的间距必须相同,但数据的长度应小于列之间所需的空间。我正在用它来获得价值:
<xsl:value-of select="package_identification"/>
如何用空格填充任何剩余空间?
答案 0 :(得分: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>
</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
答案 1 :(得分:0)
如果可以使用EXSLT,请使用str:padding函数: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))"/>
确保声明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>