XSLT如何检查XML节点是否存在?

我有一个XML文件:

<?xml version=“1.0”encoding=“utf-8”?>
<?xml样式表type=“text/xsl”href=”https://stackoverflow.com/questions/27564860/test.xsl“?>
<数据>
<记录>
<记录>
<AddInfo>
<信息>
&lt/信息>
&lt/AddInfo>
&lt/记录>
&lt/记录>
&lt/数据>

和XSL文件:

<?xml version=“1.0”encoding=“iso-8859-1”?>
<xsl:stylesheet version=“1.0”xmlns:xsl=”http://www.w3.org/1999/XSL/Transform“>
<xsl:template match=“Dane”>
<html>
<link rel=“stylesheet”type=“text/css”href=”https://stackoverflow.com/questions/27564860/report.css“&gt&lt/链接>
<车身>
<h2>表1&lt/h2>
<表格边框=“1”单元格间距=“0”>
<tr>
<th>XXX&lt/th>
&lt/tr>
<xsl:for each select=“Records/Record”>
<tr>
<td>
<xsl:select=“XXX”/>
&lt/td>
&lt/tr>
&lt/xsl:for each>
&lt/表>
<h2>第二表&lt/h2>
<表格边框=“1”单元格间距=“0”>
<tr>
<th>YYY&lt/th>
<th>ZZZ&lt/th>
&lt/tr>
<xsl:for each select=“Records/Record/AddInfo/Info”>
<tr>
<td>
<xsl:select=“YYY”/>的值;
&lt/td>
<td>
<xsl:select=“ZZZ”/>
&lt/td>
&lt/tr>
&lt/xsl:for each>
&lt/表>
&lt/车身>
&lt/html>
&lt/xsl:template>
&lt/xsl:stylesheet>

我想这样做:如果节点存在,则显示带有“Info”节点的表,如果不存在,则显示一些文本

我一直在努力

<xsl:if test=“following sibling::AddInfo”>
&lt/xsl:if>

<xsl:if test=“AddInfo”>
&lt/xsl:if>

但它不起作用

我想要这样:

表1
---------------------
|     |      |      |

(条件:如果内部XML是节点,我想显示第二个表,在表1下)

第二个表
-------------
|     |     |

我怎么能做到

如果<AddInfo&gt作为的直接子级存在<记录&gt和否则:

<?xml version=“1.0”encoding=“utf-8”?>
<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=“Data”>
<xsl:for each select=“Records/Record”>
<xsl:choose>
<xsl:when test=“AddInfo”>是的&lt/xsl:when>
<xsl:否则>没有&lt/xsl:否则>
&lt/xsl:choose>
&lt/xsl:for each>
&lt/xsl:template>
&lt/xsl:stylesheet>

请注意,对于每个,您不需要,您应该让第二个模板匹配每个<记录&gt:

<?xml version=“1.0”encoding=“utf-8”?>
<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=“Data”>
<xsl:apply templates/>
&lt/xsl:template>
<xsl:template match=“数据/记录/记录”>
<xsl:choose>
<xsl:when test=“AddInfo”>是的&lt/xsl:when>
<xsl:否则>没有&lt/xsl:否则>
&lt/xsl:choose>
&lt/xsl:template>
&lt/xsl:stylesheet>

您还可以避免选择并在条件下使用两个独立的

<xsl:template match=“数据/记录/记录”>
<xsl:if test=“AddInfo”>是的&lt/xsl:if>
<xsl:if test=“not(AddInfo)”>没有&lt/xsl:if>
&lt/xsl:template>

如果您不想将其限制为直系子女,请改用//AddInfo

考虑以下样式表:

<?xml version=“1.0”encoding=“utf-8”?>
<xsl:stylesheet version=“1.0”xmlns:xsl=”http://www.w3.org/1999/XSL/Transform“>
<xsl:output method=“xml”indent=“yes”省略xml声明=“yes”/gt;
<xsl:strip space elements=“*”/>
<xsl:template match=“Data”>
<xsl:apply templates select=“记录/记录”/>
&lt/xsl:template>
<xsl:template match=“数据/记录/记录”>
<表class=“one”&gt&lt/表>
<xsl:if test=“AddInfo”>
<表class=“两个”&gt&lt/表>
&lt/xsl:if>
&lt/xsl:template>
&lt/xsl:stylesheet>

它输出

<表class=“one”&gt&lt/表>

如果没有&lt;AddInfo&gt</中的code>节点&lt;记录&gt,以及

&lt;表class=“one”&gt&lt/表&gt;
&lt;表class=“两个”&gt&lt/表&gt;

否则

您可以不使用ifchoose解决此问题。XML:

&lt;?xml version=“1.0”encoding=“utf-8”?&gt;
&lt;?xml样式表type=“text/xsl”href=”https://stackoverflow.com/questions/27564860/test.xsl“?&gt;
&lt;数据&gt;
&lt;AddInfo&gt;
&lt;信息&gt;这一点被忽略&lt/信息&gt;
&lt/AddInfo&gt;
&lt;记录&gt;
&lt;记录&gt;
&lt;AddInfo&gt;
&lt;信息&gt;一个&lt/信息&gt;
&lt;信息&gt;二,/信息&gt;
&lt;信息&gt;三个&lt/信息&gt;
&lt/AddInfo&gt;
&lt/记录&gt;
&lt;记录&gt;
&lt;信息&gt;也被忽略&lt/信息&gt;
&lt/记录&gt;
&lt;记录&gt;
&lt;嵌套&gt;
&lt;AddInfo&gt;
&lt;信息&gt;这也是&lt/信息&gt;
&lt/AddInfo&gt;
&lt/嵌套&gt;
&lt/记录&gt;
&lt/记录&gt;
&lt/数据&gt;

XSLT:

&lt;?xml version=“1.0”encoding=“utf-8”?&gt;
&lt;xsl:stylesheet version=“1.0”xmlns:xsl=”http://www.w3.org/1999/XSL/Transform“&gt;
&lt;xsl:output method=“xml”indent=“yes”省略xml声明=“yes”/gt;
&lt;xsl:strip space elements=“*”/&gt;
&lt;xsl:template match=“Data”&gt;
&lt;根&gt;
&lt;xsl:apply templates select=“记录/记录”/&gt;
&lt/根&gt;
&lt/xsl:template&gt;
&lt;xsl:template match=“数据/记录/记录”&gt;
&lt;xsl:copy&gt;
&lt;表id=“一”&gt&lt/表&gt;
&lt;xsl:apply templates select=“AddInfo”/&gt;
&lt/xsl:copy&gt;
&lt/xsl:template&gt;
&lt;xsl:template match=“Data/Records/Record/AddInfo”&gt;
&lt;表id=“两个”&gt;
&lt;xsl:apply templates select=“Info”/&gt;
&lt/表&gt;
&lt/xsl:template&gt;
&lt;xsl:template match=“Data/Records/Record/AddInfo/Info”&gt;
&lt;xsl:select=“.”/&gt;的值;
&lt/xsl:template&gt;
&lt/xsl:stylesheet&gt;

输出:

&lt;根&gt;
&lt;记录&gt;
&lt;表id=“一”/&gt;
&lt;表id=“两个”&gt;一、二、三&lt/表&gt;
&lt/记录&gt;
&lt;记录&gt;
&lt;表id=“一”/&gt;
&lt/记录&gt;
&lt;记录&gt;
&lt;表id=“一”/&gt;
&lt/记录&gt;
&lt/根&gt;

发表评论