【问题标题】:check XSLT Element and input space if element is missing如果缺少元素,请检查 XSLT 元素和输入空间
【发布时间】:2018-06-13 19:56:22
【问题描述】:

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

当我写入 O/P 时,如果缺少任何元素,我想确保输入一个空格,否则会产生数据问题、列标题和列数据不匹配问题

<?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, 

任何机构都面临过此类问题?任何人都知道如何处理这种情况?

非常感谢任何帮助

【问题讨论】:

    标签: xslt xslt-2.0 element xslt-3.0


    【解决方案1】:

    您有两个选择,如果选择是空序列,则将子元素选择提供给输出空间的函数:

    <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 是一个在线示例。

    或者通过一种模式运行输入,用空格添加缺失的元素:

    <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 表明了这一点。

    【讨论】:

    • 谢谢马丁,我按照第一种方法,真的很有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 2012-01-06
    • 1970-01-01
    相关资源
    最近更新 更多