Как уже упоминалось, элементы находятся в пространстве имен.Один из подходов заключается в использовании префикса пространства имен ns1
во всех выражениях XPath.Тогда ваш for-each
XPath будет выглядеть так:
/ns1:File/ns1:node1/ns1:node2/ns1:node3/ns1:node4/ns1:node5/ns1:node6
И вы также должны использовать его на ns1:total
.
Другой способ - установить атрибут xpath-default-namespace="urn:uk.co.visitors.v1"
элемента xsl:stylesheet
.Затем вы можете оставить свой код как есть (как в коде ниже).
Две другие вещи: кроме удаления total
из выражения for-each
, вы должны переместить X45
и NONE
текстов в цикл for-each
.
Объединив все это, ваш шаблон можно упростить до следующего:
<xsl:template match="/">
<xsl:text>column1;column2;total</xsl:text>
<xsl:value-of select="$newline" />
<xsl:for-each select="/File/node1/node2/node3/node4/node5/node6">
<xsl:text>X45</xsl:text>
<xsl:value-of select="$delimiter" />
<xsl:text>NONE</xsl:text>
<xsl:value-of select="$delimiter" />
<xsl:value-of select="total" />
<xsl:value-of select="concat($delimiter,$newline)" />
</xsl:for-each>
</xsl:template>
Это даст вам желаемый результат.Это может быть дополнительно упрощено до
<xsl:template match="/">
<xsl:text>column1;column2;total</xsl:text>
<xsl:value-of select="$newline" />
<xsl:for-each select="/File/node1/node2/node3/node4/node5/node6">
<xsl:value-of select="concat('X45',$delimiter,'NONE',$delimiter,total,$delimiter,$newline)" />
</xsl:for-each>
</xsl:template>
, что дает тот же результат.