将空 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>