我有如下定义的xml。节点 EducationDetails 可以重复(无界限)。
<PersonalDetailsResponse>
<FirstName></FirstName>
<LastName></LastName>
<EducationDetails>
<Degree></Degree>
<Institution></Institution>
<Year></Year>
</EducationDetails>
<EducationDetails>
<Degree></Degree>
<Institution></Institution>
<Year></Year>
</EducationDetails>
</PersonalDetailsResponse>
&#13;
我想使用xslt从上面创建另一个xml。 我的要求是,如果任何 EducationDetails 子节点中没有数据,那么生成的xml必须从另一个源获取数据。
我的问题是,我无法检查所有 EducationDetails 子节点是否为空。
由于变量值无法在xslt中更改,我尝试使用saxon和下面的代码。
xmlns:saxon="http://saxon.sf.net/" extension-element-prefixes="saxon"
<xsl:variable name="emptyNode" saxon:assignable="yes" select="0" />
<xsl:when test="count(ss:education) > 0">
<xsl:for-each select="ss:education">
<xsl:if test="not(*[.=''])">
<saxon:assign name="emptyNode">
<xsl:value-of select="1" />
</saxon:assign>
</xsl:if>
</xsl:for-each>
<xsl:if test="$emptyNode = 0">
<!-- Do logic if all educationdetails node is empty-->
</xsl:if>
</xsl:when>
但它抛出异常&#34; net.sf.saxon.trans.XPathException:未知的扩展指令&#34; 。 看起来它需要saxon 9 jar,我无法从我的存储库中获取。
是否有更简单的方法来检查所有子节点是否为空。 我的意思是,空的子节点可能存在,但没有值。
答案 0 :(得分:0)
好吧,如果您使用<xsl:template match="PersonalDetailsResponse[EducationDetails[*[normalize-space()]]">...</xsl:template>
,那么您只匹配至少有一个PersonalDetailsResponse
元素的EducationDetails
元素,该元素至少有一个具有非空白数据的子元素。当你似乎使用XSLT 2.0处理器时,你也可以使用更清晰的<xsl:template match="PersonalDetailsResponse[some $ed in EducationDetails/* satisfies normalize-space($ed)]">...</xsl:template>
。
或者如果您想在模板中使用变量
<xsl:template match="PersonalDetailsResponse">
<xsl:variable name="empty-details" select="not(EducationDetails/*[normalize-space()])"/>
<xsl:if test="$empty-details">...</xsl:if>
</xsl:template>
使用XSLT 2.0,some
或every
satisfies
的使用可能更容易理解,例如。
<xsl:template match="PersonalDetailsResponse">
<xsl:variable name="empty-details" select="every $dt in EducationDetails/* satisfies not(normalize-space($dt))"/>
<xsl:if test="$empty-details">...</xsl:if>
</xsl:template>
但通常使用适当的匹配条件编写模板可以避免在模板中使用xsl:if
或xsl:choose
。