我对XSL很新,我遇到了一些问题。
我使用的XML有一些标签,如<Example/>
。
在我的XSL中(输出是HTML)我对没有数据的标签使用了类似的东西:
<xsl:if test="count(ContractNr) > 0">
<td>Nr:</td>
<td><xsl:value-of select="ContractNr"/></td>
</xsl:if>
没有标签时效果很好。
但如何为<xsl:if>
之类的内容制作<ContractNumber/>
?
Ty,对不起我的英语。
更新:编辑了我的帖子,抱歉..我的意思是我的示例在xml中不存在我测试的标签时有效,但我如何测试标签是否为空“喜欢或
是的,Treemonkey,但我不确定这是否是我正在寻找的解决方案。我会尝试更好地解释。
在xml输入文件中有许多标签是“可选”或“minOccurs =”0“”(根据模式)。使用xsl我尝试用表格创建一个html输出,我使用<xsl:if>
来确定标签是否存在于xml中(没有标签=没有列)。
我给我的html表列提供静态名称(xml中的数据不能用于命名)并将数据从xml中放入。现在,当标记为<smthng/>
时,我仍然会获得具有给定静态名称的列 - 这就是问题所在。我想制作一个xsl:if
,这样如果有一个<smthng/>
该列没有制作:
<table>
<tr><xsl:if ...>
<td>Some name:</td>
<td><xsl:value-of select="smthng"/></td></xsl:if>
</tr>
</table>
答案 0 :(得分:1)
<xsl:if test="count(ContractNr) > 0"> <td>Nr:</td> <td><xsl:value-of select="ContractNr"/></td> </xsl:if>
错误 XSLT 。
更好地使用:
<xsl:apply-templates select="ContractNr[1]"/>
并拥有单独的模板:
<xsl:template match="ContractNr/text()">
<td>Nr:</td>
<td><xsl:value-of select="."/></td>
</xsl:template>
需要学习的课程:XSLT模式匹配使得大量条件逻辑成为其他编程语言的“典型”。
答案 1 :(得分:0)
<ContractNumber></ContractNumber>
与<ContractNumber/>
不相同吗?
答案 2 :(得分:0)
我编辑了我的1个帖子,抱歉..我的意思是我的<xsl:if>
示例在xml中不存在我测试的标签时有效,但我如何测试标签是否为“空”如{ {1}}或<smthng/>
我会尝试更好地解释。
在xml输入文件中有许多标签是“可选”或“minOccurs =”0“”(根据模式)。
使用xsl我尝试用表格创建一个html输出,我使用<smthng></smthng>
来确定标签是否存在于xml中(没有标签=没有列)。
我给我的html表列提供静态名称(xml中的数据不能用于命名)并将数据从xml中放入。现在,当标记为<xsl:if>
时,我仍然会获得具有给定静态名称的列 - 这就是问题所在。
我想创建一个xsl:如果是这样的话,如果有一个<smthng/>
,则不会创建该列:
<smthng/>
答案 3 :(得分:0)
这是你想要的吗? 这将检查元素,然后允许您使用local-name()函数
来使用节点的名称这也回答你的第二个问题,使用节点的应用模板只会将模板应用于匹配的元素,所以如果没有匹配就会自然地和IF一样自然地工作!
<xsl:template match="/">
<xsl:apply-templates select="ContractNumber"/>
</xsl:template>
<xsl:template match="ContractNumber">
<div>
<xsl:value-of select="local-name()"/>
</div>
</xsl:template>
您可以使用以下
<xsl:if test="ContractNumber=''"> do stuff </xsl:if>
或
<xsl:choose>
<xsl:when test="ContractNumber=''">
<!--do nothing-->
</xsl:when>
<xsl:otherwise>
<!--build table -->
</xsl:otherwise>
</xsl:choose>
答案 4 :(得分:0)
我认为这就是你想要的两种解决方案。
使用此输入:
<table>
<row>
<a>A1</a>
<b>B1</b>
<c>C1</c>
</row>
<row>
<a>A2</a>
<b>B2</b>
</row>
<row>
<a>A3</a>
<b/>
<c>C3</c>
</row>
</table>
此样式表:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:h="header"
exclude-result-prefixes="h">
<h:header title="First" element="a"/>
<h:header title="Second" element="b"/>
<h:header title="Third" element="c"/>
<xsl:template match="table">
<html>
<table style="border:1px solid black;">
<tr>
<xsl:apply-templates select="document('')/*/h:*"
mode="header"/>
</tr>
<xsl:apply-templates/>
</table>
</html>
</xsl:template>
<xsl:template match="row">
<tr>
<xsl:apply-templates select="document('')/*/h:*">
<xsl:with-param name="pContext" select="."/>
</xsl:apply-templates>
</tr>
</xsl:template>
<xsl:template match="h:*">
<xsl:param name="pContext"/>
<td>
<xsl:value-of select="$pContext/*[name()=current()/@element]"/>
</td>
</xsl:template>
<xsl:template match="h:*" mode="header">
<th>
<xsl:value-of select="@title"/>
</th>
</xsl:template>
</xsl:stylesheet>
输出:
<html>
<table style="border:1px solid black;">
<tr>
<th>First</th>
<th>Second</th>
<th>Third</th>
</tr>
<tr>
<td>A1</td>
<td>B1</td>
<td>C1</td>
</tr>
<tr>
<td>A2</td>
<td>B2</td>
<td></td>
</tr>
<tr>
<td>A3</td>
<td></td>
<td>C3</td>
</tr>
</table>
</html>
还有其他样式表:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:h="header"
exclude-result-prefixes="h">
<h:header title="First" element="a"/>
<h:header title="Second" element="b"/>
<h:header title="Third" element="c"/>
<xsl:template match="table">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>
<xsl:template match="row">
<table style="border:1px solid black;">
<xsl:apply-templates select="document('')/*/h:*">
<xsl:with-param name="pContext" select="."/>
</xsl:apply-templates>
</table>
</xsl:template>
<xsl:template match="h:*">
<xsl:param name="pContext"/>
<tr>
<th>
<xsl:value-of select="@title"/>
</th>
<td>
<xsl:value-of select="$pContext/*[name()=current()/@element]"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
输出:
<html>
<table style="border:1px solid black;">
<tr>
<th>First</th>
<td>A1</td>
</tr>
<tr>
<th>Second</th>
<td>B1</td>
</tr>
<tr>
<th>Third</th>
<td>C1</td>
</tr>
</table>
<table style="border:1px solid black;">
<tr>
<th>First</th>
<td>A2</td>
</tr>
<tr>
<th>Second</th>
<td>B2</td>
</tr>
<tr>
<th>Third</th>
<td></td>
</tr>
</table>
<table style="border:1px solid black;">
<tr>
<th>First</th>
<td>A3</td>
</tr>
<tr>
<th>Second</th>
<td></td>
</tr>
<tr>
<th>Third</th>
<td>C3</td>
</tr>
</table>
</html>
注意:我认为你正在使用行标题,因为空元素或不存在元素存在问题。请注意对标题名称和列顺序使用内联映射(可能在其他输入源中)(是否存在)。