我创建了一个带有各种验证等的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)
答案 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>
</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模板规则应该选择包含文本的节点并正常输出值。