检查 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> </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 </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> </xsl:text>
</xsl:template>
</xsl:stylesheet>
我正在转换传入的 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> </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 </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> </xsl:text>
</xsl:template>
</xsl:stylesheet>