使用XSLT为每个空字段传递文本值

时间:2016-06-18 04:02:08

标签: xml xslt xpath

我创建了一个带有各种验证等的XSLT。现在我的客户希望我为每个空值传递XXX。有很多字段,我不想手动为每个字段做。可以请你帮忙。下面是我的XSLT

(编辑和简化我的查询)

我的XML:

<?xml version="1.0" encoding="UTF-8"?>
<contract>
<customerName>foo</customerName>
<contractID />
<customerID>912</customerID>
<countryCode/>
<cityCode>7823</cityCode>
</contract>

XSLT:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="/">
    <xsl:value-of select="contract/customerName"/>
    <xsl:text>|</xsl:text>
    <xsl:value-of select="contract/contractID"/>
</xsl:template>   

</xsl:stylesheet>

我希望输出为foo | XXX(任何空白字段为XXX)

3 个答案:

答案 0 :(得分:2)

使用此模板:

<xsl:template match="*[normalize-space(text()) = '']">
  <xsl:copy>XXX</xsl:copy>
</xsl:template>

答案 1 :(得分:1)

由于您似乎在使用XSLT 2.0,我建议采用完全不同的方法。

以下是生成结果标题部分的最小化示例:

XSLT 2.0

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:wd="urn:com.workday/bsvc">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>

<xsl:template match="wd:Get_Workers_Response">
    <!--Defining Header-->
    <xsl:variable name="header-fields" select="
        wd:Request_Criteria/wd:Organization_Reference/wd:ID[@wd:type='Organization_Reference_ID'],
        wd:Response_Results/wd:Total_Results,
        wd:Response_Results/wd:Total_Pages,
        format-date(current-date(), '[M01][D01][Y0001]')" />
    <xsl:value-of select="string-join(for $i in $header-fields return if (string($i)) then $i else 'XXX', '|')"/>
    <xsl:text>&#xa;</xsl:text>
    <!--Ending Header-->

    <!--  ... continue for Employee Data and Footer ...  -->
</xsl:template>

</xsl:stylesheet>

请注意,这假定“字段”可以为空,但不会丢失。

答案 2 :(得分:0)

继@Kirill Polishchuk回答后,

使用:

<!-- the not(*) is optional in the case, but ensure you're only hitting on leaf nodes -->
<xsl:template match="*[not(*) and normalize-space(text()) = '']">
     <xsl:text>XXX</xsl:text>
</xsl:template>

并将&lt; xsl:value-of ... /&gt; 的所有内容更改为&lt; xsl:apply-templates ... /&gt; 默认的xsl模板规则应该选择包含文本的节点并正常输出值。