我有一个XML文件:
<;?xml version=“1.0”encoding=“utf-8”?>;
<;?xml样式表type=“text/xsl”href=”https://stackoverflow.com/questions/27564860/test.xsl“?>;
<;数据>;
<;记录>;
<;记录>;
<;AddInfo>;
<;信息>;
</信息>;
</AddInfo>;
</记录>;
</记录>;
</数据>;
和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“></链接>;
<;车身>;
<;h2>;表1</h2>;
<;表格边框=“1”单元格间距=“0”>;
<;tr>;
<;th>;XXX</th>;
</tr>;
<;xsl:for each select=“Records/Record”>;
<;tr>;
<;td>;
<;xsl:select=“XXX”/>;
</td>;
</tr>;
</xsl:for each>;
</表>;
<;h2>;第二表</h2>;
<;表格边框=“1”单元格间距=“0”>;
<;tr>;
<;th>;YYY</th>;
<;th>;ZZZ</th>;
</tr>;
<;xsl:for each select=“Records/Record/AddInfo/Info”>;
<;tr>;
<;td>;
<;xsl:select=“YYY”/>;的值;
</td>;
<;td>;
<;xsl:select=“ZZZ”/>;
</td>;
</tr>;
</xsl:for each>;
</表>;
</车身>;
</html>;
</xsl:template>;
</xsl:stylesheet>;
我想这样做:如果节点存在,则显示带有“Info”节点的表,如果不存在,则显示一些文本
我一直在努力
<;xsl:if test=“following sibling::AddInfo”>;
</xsl:if>;
及
<;xsl:if test=“AddInfo”>;
</xsl:if>;
但它不起作用
我想要这样:
表1
---------------------
| | | |
(条件:如果内部XML是节点,我想显示第二个表,在表1下)
第二个表
-------------
| | |
我怎么能做到
如果<;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=“text”/>;
<;xsl:strip space elements=“*”/>;
<;xsl:template match=“Data”>;
<;xsl:for each select=“Records/Record”>;
<;xsl:choose>;
<;xsl:when test=“AddInfo”>;是的</xsl:when>;
<;xsl:否则>;没有</xsl:否则>;
</xsl:choose>;
</xsl:for each>;
</xsl:template>;
</xsl:stylesheet>;
请注意,对于每个,您不需要,您应该让第二个模板匹配每个<;记录>:
<;?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/>;
</xsl:template>;
<;xsl:template match=“数据/记录/记录”>;
<;xsl:choose>;
<;xsl:when test=“AddInfo”>;是的</xsl:when>;
<;xsl:否则>;没有</xsl:否则>;
</xsl:choose>;
</xsl:template>;
</xsl:stylesheet>;
您还可以避免选择并在条件下使用两个独立的:
<;xsl:template match=“数据/记录/记录”>;
<;xsl:if test=“AddInfo”>;是的</xsl:if>;
<;xsl:if test=“not(AddInfo)”>;没有</xsl:if>;
</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=“记录/记录”/>;
</xsl:template>;
<;xsl:template match=“数据/记录/记录”>;
<;表class=“one”></表>;
<;xsl:if test=“AddInfo”>;
<;表class=“两个”></表>;
</xsl:if>;
</xsl:template>;
</xsl:stylesheet>;
它输出
<;表class=“one”></表>;
如果没有<;AddInfo></中的code>节点<;记录>,以及
<;表class=“one”></表>;
<;表class=“两个”></表>;
否则
您可以不使用if或choose解决此问题。XML:
<;?xml version=“1.0”encoding=“utf-8”?>;
<;?xml样式表type=“text/xsl”href=”https://stackoverflow.com/questions/27564860/test.xsl“?>;
<;数据>;
<;AddInfo>;
<;信息>;这一点被忽略</信息>;
</AddInfo>;
<;记录>;
<;记录>;
<;AddInfo>;
<;信息>;一个</信息>;
<;信息>;二,/信息>;
<;信息>;三个</信息>;
</AddInfo>;
</记录>;
<;记录>;
<;信息>;也被忽略</信息>;
</记录>;
<;记录>;
<;嵌套>;
<;AddInfo>;
<;信息>;这也是</信息>;
</AddInfo>;
</嵌套>;
</记录>;
</记录>;
</数据>;
XSLT:
<;?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=“记录/记录”/>;
</根>;
</xsl:template>;
<;xsl:template match=“数据/记录/记录”>;
<;xsl:copy>;
<;表id=“一”></表>;
<;xsl:apply templates select=“AddInfo”/>;
</xsl:copy>;
</xsl:template>;
<;xsl:template match=“Data/Records/Record/AddInfo”>;
<;表id=“两个”>;
<;xsl:apply templates select=“Info”/>;
</表>;
</xsl:template>;
<;xsl:template match=“Data/Records/Record/AddInfo/Info”>;
<;xsl:select=“.”/>;的值;
</xsl:template>;
</xsl:stylesheet>;
输出:
<;根>;
<;记录>;
<;表id=“一”/>;
<;表id=“两个”>;一、二、三</表>;
</记录>;
<;记录>;
<;表id=“一”/>;
</记录>;
<;记录>;
<;表id=“一”/>;
</记录>;
</根>;