将空 XML 数据节点显示为文本消息
Display empty XML data node as text message
我是 xml 的新手,我在使用模板时遇到了一个奇怪的问题。对于空数据节点,我不想在数据应该显示的地方显示空白 space,而是想在 html 页面上显示 'None Found' 或 'No Data' 之类的消息。我已经完成了一个 xsl:choose 语句和 2 个 xsl:if 语句,但都没有成功。我已经知道这个特定节点是空的,我只想显示一条消息而不是空白 space。 Otherwise 或 False 语句似乎根本 运行。请帮忙!!我在这里做错了什么?
XML代码
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<findings>
<ssns/>
<dobs>
<dob>
<data>082967</data>
</dob>
</dobs>
<dobs>
<dob>
<data>020568</data>
</dob>
</dobs>
<names>
<name>
<full>Homer J Simpson</full>
<first>Homer</first>
<last>Simpson</last>
<middle>J</middle>
</name>
</names>
<names>
<name>
<full>Marge H Simpson</full>
<first>Marge</first>
<last>Simpson</last>
<middle>H</middle>
</name>
</names>
</findings>
</Root>
XSL 代码
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<hmtl>
<head>
<title>Person Results</title>
</head>
<div style="font-weight:bold">Alias(es):</div>
<xsl:apply-templates select="Root/findings/names"/>
<div style="font-weight:bold">SSNs:</div>
<xsl:apply-templates select="Root/findings/ssns"/>
<div style="font-weight:bold">DOBs:</div>
<xsl:apply-templates select="Root/findings/dobs"/>
</hmtl>
</xsl:template>
<xsl:template match="Root/findings/names">
<p>
<xsl:variable name="nmesHasData" select="boolean(normalize-space(name))"/>
<xsl:for-each select="name">
<xsl:choose>
<xsl:when test="$nmesHasData">
<ul> <xsl:apply-templates select="full"/> </ul>
</xsl:when>
<xsl:otherwise>
<xsl:text>None found</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</p>
</xsl:template>
<xsl:template match="Root/findings/ssns">
<p>
<xsl:variable name="ssnHasData" select="boolean(normalize-space(ssns))"/>
<xsl:for-each select="ssn">
<xsl:choose>
<xsl:when test="$ssnHasData">
<ul><xsl:apply-templates select="data"/></ul>
</xsl:when>
<xsl:otherwise>
<xsl:text>None found</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</p>
</xsl:template>
<xsl:template match="Root/findings/dobs">
<p>
<xsl:variable name="dobHasData" select="boolean(normalize-space(dob))"/>
<xsl:for-each select="dob">
<xsl:choose>
<xsl:when test="$dobHasData">
<ul><xsl:apply-templates select="data"/></ul>
</xsl:when>
<xsl:otherwise>
<xsl:text>None found</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</p>
</xsl:template>
</xsl:transform>
HTML 结果
<!DOCTYPE html
PUBLIC "XSLT-compat">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Person Results</title>
</head>
<div style="font-weight:bold">Alias(es):</div>
<p>
<ul>Homer J Simpson</ul>
</p>
<p>
<ul>Marge H Simpson</ul>
</p>
<div style="font-weight:bold">SSNs:</div>
<p></p>
<div style="font-weight:bold">DOBs:</div>
<p>
<ul>082967</ul>
</p>
<p>
<ul>020568</ul>
</p>
</html>
将模板 match="Root/findings/dobs" 更改为:
<xsl:template match="Root/findings/dobs">
<p>
<xsl:for-each select="dob">
<xsl:variable name="dobHasData" select="boolean(normalize-space(.))"/>
<xsl:choose>
<xsl:when test="$dobHasData">
<ul><xsl:apply-templates select="data"/></ul>
</xsl:when>
<xsl:otherwise>
<xsl:text>None found</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</p>
</xsl:template>
甚至 more template matching like:
<xsl:template match="Root/findings/dobs">
<p>
<xsl:apply-templates select="dob"/>
</p>
</xsl:template>
<xsl:template match="dob">
<xsl:variable name="dobHasData" select="boolean(normalize-space(.))"/>
<xsl:choose>
<xsl:when test="$dobHasData">
<ul><xsl:apply-templates select="data"/></ul>
</xsl:when>
<xsl:otherwise>
<xsl:text>None found</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
最后这个模板也可以分成两个短的:
<xsl:template match="dob[normalize-space(.)]">
<ul><xsl:apply-templates select="data"/></ul>
</xsl:template>
<xsl:template match="dob[not(normalize-space(.))]">
<xsl:text>None found</xsl:text>
</xsl:template>
我是 xml 的新手,我在使用模板时遇到了一个奇怪的问题。对于空数据节点,我不想在数据应该显示的地方显示空白 space,而是想在 html 页面上显示 'None Found' 或 'No Data' 之类的消息。我已经完成了一个 xsl:choose 语句和 2 个 xsl:if 语句,但都没有成功。我已经知道这个特定节点是空的,我只想显示一条消息而不是空白 space。 Otherwise 或 False 语句似乎根本 运行。请帮忙!!我在这里做错了什么?
XML代码
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<findings>
<ssns/>
<dobs>
<dob>
<data>082967</data>
</dob>
</dobs>
<dobs>
<dob>
<data>020568</data>
</dob>
</dobs>
<names>
<name>
<full>Homer J Simpson</full>
<first>Homer</first>
<last>Simpson</last>
<middle>J</middle>
</name>
</names>
<names>
<name>
<full>Marge H Simpson</full>
<first>Marge</first>
<last>Simpson</last>
<middle>H</middle>
</name>
</names>
</findings>
</Root>
XSL 代码
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<hmtl>
<head>
<title>Person Results</title>
</head>
<div style="font-weight:bold">Alias(es):</div>
<xsl:apply-templates select="Root/findings/names"/>
<div style="font-weight:bold">SSNs:</div>
<xsl:apply-templates select="Root/findings/ssns"/>
<div style="font-weight:bold">DOBs:</div>
<xsl:apply-templates select="Root/findings/dobs"/>
</hmtl>
</xsl:template>
<xsl:template match="Root/findings/names">
<p>
<xsl:variable name="nmesHasData" select="boolean(normalize-space(name))"/>
<xsl:for-each select="name">
<xsl:choose>
<xsl:when test="$nmesHasData">
<ul> <xsl:apply-templates select="full"/> </ul>
</xsl:when>
<xsl:otherwise>
<xsl:text>None found</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</p>
</xsl:template>
<xsl:template match="Root/findings/ssns">
<p>
<xsl:variable name="ssnHasData" select="boolean(normalize-space(ssns))"/>
<xsl:for-each select="ssn">
<xsl:choose>
<xsl:when test="$ssnHasData">
<ul><xsl:apply-templates select="data"/></ul>
</xsl:when>
<xsl:otherwise>
<xsl:text>None found</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</p>
</xsl:template>
<xsl:template match="Root/findings/dobs">
<p>
<xsl:variable name="dobHasData" select="boolean(normalize-space(dob))"/>
<xsl:for-each select="dob">
<xsl:choose>
<xsl:when test="$dobHasData">
<ul><xsl:apply-templates select="data"/></ul>
</xsl:when>
<xsl:otherwise>
<xsl:text>None found</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</p>
</xsl:template>
</xsl:transform>
HTML 结果
<!DOCTYPE html
PUBLIC "XSLT-compat">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Person Results</title>
</head>
<div style="font-weight:bold">Alias(es):</div>
<p>
<ul>Homer J Simpson</ul>
</p>
<p>
<ul>Marge H Simpson</ul>
</p>
<div style="font-weight:bold">SSNs:</div>
<p></p>
<div style="font-weight:bold">DOBs:</div>
<p>
<ul>082967</ul>
</p>
<p>
<ul>020568</ul>
</p>
</html>
将模板 match="Root/findings/dobs" 更改为:
<xsl:template match="Root/findings/dobs">
<p>
<xsl:for-each select="dob">
<xsl:variable name="dobHasData" select="boolean(normalize-space(.))"/>
<xsl:choose>
<xsl:when test="$dobHasData">
<ul><xsl:apply-templates select="data"/></ul>
</xsl:when>
<xsl:otherwise>
<xsl:text>None found</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</p>
</xsl:template>
甚至 more template matching like:
<xsl:template match="Root/findings/dobs">
<p>
<xsl:apply-templates select="dob"/>
</p>
</xsl:template>
<xsl:template match="dob">
<xsl:variable name="dobHasData" select="boolean(normalize-space(.))"/>
<xsl:choose>
<xsl:when test="$dobHasData">
<ul><xsl:apply-templates select="data"/></ul>
</xsl:when>
<xsl:otherwise>
<xsl:text>None found</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
最后这个模板也可以分成两个短的:
<xsl:template match="dob[normalize-space(.)]">
<ul><xsl:apply-templates select="data"/></ul>
</xsl:template>
<xsl:template match="dob[not(normalize-space(.))]">
<xsl:text>None found</xsl:text>
</xsl:template>