检查 XSLT 元素并输入 space 如果缺少元素

check XSLT Element and input space if element is missing

我正在转换传入的 XML,其中某些元素不会显示。如果元素没有数据,那么该特定元素将不会显示。在下面的示例示例中,我总共有 4 个 XML 报告组,其中每个组的预期标签是 EmployeeId、first_name、last_name、job_code、active 总共 5 个标签。然而,对于少数组,某些或其他元素将在我需要放置 space 的位置丢失。对于报告组 1 和 3,所有元素都存在,但报告条目 2 last_name 缺失,对于报告条目 4,活动和 first_name 都缺失

当我写入 O/P 时,如果缺少任何元素,我想确保输入 space 否则会造成数据问题、列标题和列数据不匹配问题

<?xml version="1.0" encoding="UTF-8"?>
<master>
<report_group>
    <employeeid>05121</employeeid>
    <first_name>John</first_name>
    <last_name>Blad</last_name>
    <job_code>0001</job_code>
   <active>Y</active>
</report_group>
<report_group>
    <employeeid>05671</employeeid>
    <first_name>Cris</first_name>
    <job_code>0002</job_code>
    <active>N</active>     
</report_group>
<report_group>
    <employeeid>05432</employeeid>
    <first_name>Vel</first_name>
    <last_name>Harris</last_name>
    <job_code>0004</job_code>
    <active>Y</active>
</report_group>
<report_group>
    <employeeid>05672</employeeid>
    <last_name>vens</last_name>
    <job_code>789</job_code>
</report_group>

预期输出为 CSV 格式,如下所示

id,fname,lname,jbcode,active
05121,John,Blad,0001,Y
05671,Cris, ,0002,N
05432,Vel,Harris,0004,Y
05672, ,vens,789, 

任何 body 遇到过此类问题? body 知道如何处理这种情况吗?

非常感谢任何帮助

你有两个选择,要么将子元素选择提供给一个函数,如果选择是一个空序列,该函数输出 space:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:mf="http://example.com/mf"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    version="3.0">

  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>

  <xsl:function name="mf:space-if-empty" as="xs:string">
      <xsl:param name="input" as="item()?"/>
      <xsl:sequence select="if (empty($input)) then ' ' else string($input)"/>
  </xsl:function>

  <xsl:template match="report_group">
      <xsl:value-of select="mf:space-if-empty(employeeid), mf:space-if-empty(first_name), mf:space-if-empty(last_name), mf:space-if-empty(job_code), mf:space-if-empty(active)" separator=","/>
      <xsl:text>&#10;</xsl:text>
  </xsl:template>

</xsl:stylesheet>

http://xsltfiddle.liberty-development.net/pPqsHTm 是在线样本。

或 运行 通过一种模式输入,将缺少的元素添加到 space:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:mf="http://example.com/mf"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs mf"
    expand-text="yes"
    version="3.0">

  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>

  <xsl:mode name="add-dummy-elements" on-no-match="shallow-copy"/>

  <xsl:template match="report_group" mode="add-dummy-elements">
      <xsl:copy>
          <employeeid>{mf:space-if-empty(employeeid)}</employeeid>
          <first_name>{mf:space-if-empty(first_name)}</first_name>
          <last_name>{mf:space-if-empty(last_name)}</last_name>
          <job_code>{mf:space-if-empty(job_code)}</job_code>
          <active>{mf:space-if-empty(active)}</active>
      </xsl:copy>
  </xsl:template>

  <xsl:function name="mf:space-if-empty" as="xs:string">
      <xsl:param name="input" as="item()?"/>
      <xsl:sequence select="if (empty($input)) then ' ' else string($input)"/>
  </xsl:function>

  <xsl:variable name="input-with-dummies-added">
      <xsl:apply-templates mode="add-dummy-elements"/>
  </xsl:variable>

  <xsl:template match="/">
      <xsl:text>id,fname,lname,jbcode,active&#10;</xsl:text>
      <xsl:apply-templates select="$input-with-dummies-added/node()"/>
  </xsl:template>

  <xsl:template match="report_group">
      <xsl:value-of select="employeeid, first_name, last_name, job_code, active" separator=","/>
      <xsl:text>&#10;</xsl:text>
  </xsl:template>

</xsl:stylesheet>

http://xsltfiddle.liberty-development.net/pPqsHTm/1 表明。