<grid>
<col>Links</col>
<col>Rechts</col>
<row>
<Links>l1</Links>
<Rechts>r1</Rechts>
</row>
<row>
<Links>l2</Links>
<Rechts>r2</Rechts>
</row>
</grid>
嘿伙计们,鉴于上面的XML数据,我想创建一个像:
这样的表Links|Rechts
l1|r1
l2|r2
我的XSL模板是:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dyn="http://exslt.org/dynamic"
extension-element-prefixes="dyn">
<xsl:template match="grid">
<xsl:for-each select="//row">
<xsl:variable name="currentrow" select="."/>
<xsl:for-each select="//col">
<xsl:variable name="colname" select="text()"/>
<xsl:value-of select="dyn:evaluate('$currentrow/$colname/text()')"></xsl:value-of>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我得到的唯一输出是“”。
我不知道如何解决我的问题。我不知道事件是否是使用dyn的正确方法:评估。
感谢您的帮助!
答案 0 :(得分:1)
用
替换您的XSLTgrid
部分
<xsl:template match="grid">
<xsl:for-each select="row">
<xsl:value-of select="Links"/>|
<xsl:value-of select="Rechts"/><br>
</xsl:for-each>
</xsl:template>
我使用<br>
作为换行符,如果这不是HTML,请使用相关的符号。
答案 1 :(得分:1)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*" />
<xsl:template match="grid">
<xsl:apply-templates select="col" />
<xsl:apply-templates select="row" />
</xsl:template>
<xsl:template match="col|row/*">
<xsl:value-of select="." />
<xsl:choose>
<xsl:when test="position() = last()"><xsl:value-of select="'
'" /></xsl:when>
<xsl:otherwise>|</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
注释
<xsl:strip-space elements="*">
删除否则将出现在输出|
)row/*
编辑一个更精细的版本,并不假设每一列都在那里。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*" />
<xsl:template match="grid">
<xsl:apply-templates select="col" />
<xsl:apply-templates select="row" />
</xsl:template>
<xsl:template match="col">
<xsl:value-of select="." />
<xsl:call-template name="separator" />
</xsl:template>
<xsl:template match="row">
<xsl:variable name="this" select="." />
<xsl:for-each select="/grid/col">
<xsl:value-of select="$this/*[name() = current()]" />
<xsl:call-template name="separator" />
</xsl:for-each>
</xsl:template>
<xsl:template name="separator">
<xsl:choose>
<xsl:when test="position() = last()"><xsl:value-of select="'
'" /></xsl:when>
<xsl:otherwise>|</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
此样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="vColNames" select="/grid/col"/>
<xsl:template match="grid">
<table>
<xsl:apply-templates/>
</table>
</xsl:template>
<xsl:template match="col"/>
<xsl:template match="col[1]">
<tr>
<xsl:apply-templates select="../col" mode="wrap"/>
</tr>
</xsl:template>
<xsl:template match="col" mode="wrap">
<th>
<xsl:apply-templates/>
</th>
</xsl:template>
<xsl:template match="row">
<xsl:variable name="vCurrent" select="."/>
<tr>
<xsl:for-each select="$vColNames">
<xsl:apply-templates select="$vCurrent/*[name()=current()]"/>
</xsl:for-each>
</tr>
</xsl:template>
<xsl:template match="row/*">
<td>
<xsl:apply-templates/>
</td>
</xsl:template>
</xsl:stylesheet>
输出:
<table>
<tr>
<th>Links</th>
<th>Rechts</th>
</tr>
<tr>
<td>l1</td>
<td>r1</td>
</tr>
<tr>
<td>l2</td>
<td>r2</td>
</tr>
</table>
注意:在row
上下文中迭代列的名称。
答案 3 :(得分:0)
此转换(拥有最少数量的模板 - 只有3个,比所有其他当前解决方案更短,并且对元素顺序或缺少col
元素具有弹性):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="col[not(position()=last())]">
<xsl:value-of select="concat(.,'|')"/>
</xsl:template>
<xsl:template match="row">
<xsl:text>
</xsl:text>
<xsl:apply-templates select="/*/col"
mode="buildCell">
<xsl:with-param name="pRow" select="."/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="col" mode="buildCell">
<xsl:param name="pRow"/>
<xsl:value-of select=
"concat($pRow/*[name()=current()],
substring('|', (position()=last())+1)
)
"/>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档时:
<grid>
<col>Links</col>
<col>Rechts</col>
<row>
<Links>l1</Links>
<Rechts>r1</Rechts>
</row>
<row>
<Links>l2</Links>
<Rechts>r2</Rechts>
</row>
</grid>
会产生想要的正确结果:
Links|Rechts
l1|r1
l2|r2