У вас есть две проблемы в вашем XSLT.
Во-первых, вы не учли тот факт, что элементы в вашем XML находятся в пространстве имен по умолчанию, как определено xmlns='http://java.sun.com/xml/ns/jdbc
в вашем корневом элементе.
Если вы действительно используете только XSLT 1.0, вам нужно связать это пространство имен с префиксом в вашем XSLT, например так ...
xmlns:j="http://java.sun.com/xml/ns/jdbc"
И затем использовать этот префикс перед всемиэлементы в ваших выбранных выражениях.Например ...
<xsl:template match="j:webRowSet/j:data">
Во-вторых, в вашем count
выражении ..
представляет родительский узел, когда вы действительно хотите сосчитать предшествующих братьев и сестер текущего узла, поэтому вы должны написатьэто ...
<xsl:variable name="Rec_position" select="count(preceding-sibling::j:columnValue)+1"/>
Хотя функция position()
здесь будет делать то же самое.
<xsl:variable name="Rec_position" select="position()"/>
Но вы действительно хотите жестко закодировать число столбцов как6 хоть?Вместо этого попробуйте этот XSLT:
<xsl:stylesheet version ="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:j="http://java.sun.com/xml/ns/jdbc">
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="Delimiter"><xsl:text>|</xsl:text></xsl:variable>
<xsl:variable name="NewLine"><xsl:text> </xsl:text></xsl:variable>
<xsl:template match="/">
<xsl:text>EXPR5_5|VOUCHER_ID|INVOICE_ID|ENTERED_DT|GROSS_AMT|UnifierRecordNo</xsl:text>
<xsl:value-of select="$NewLine"/>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="j:webRowSet/j:data">
<xsl:for-each select="j:currentRow">
<xsl:for-each select="j:columnValue">
<xsl:if test="position() != 1"><xsl:value-of select="$Delimiter" /></xsl:if>
<xsl:value-of select="."/>
</xsl:for-each>
<xsl:value-of select="$NewLine"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Обратите внимание, если вы можете использовать XSLT 2.0, вы можете написать его так:
<xsl:stylesheet version ="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://java.sun.com/xml/ns/jdbc">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="NewLine"><xsl:text> </xsl:text></xsl:variable>
<xsl:template match="/">
<xsl:text>EXPR5_5|VOUCHER_ID|INVOICE_ID|ENTERED_DT|GROSS_AMT|UnifierRecordNo</xsl:text>
<xsl:value-of select="$NewLine"/>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="webRowSet/data">
<xsl:for-each select="currentRow">
<xsl:value-of select="columnValue" separator="|"/>
<xsl:value-of select="$NewLine"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Обратите внимание на использование xpath-default-namespace
, которое делает обработку по умолчаниюПространства имен проще.Кроме того, использование separator
на xsl:value-of
, которое применяется при выборе нескольких значений.(В XSLT 1.0 xsl:value-of
будет отображать только первое значение).