检查xslt中重复节点是否为空

时间:2015-12-30 11:34:39

标签: xslt

我有如下定义的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;
&#13;
&#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,我无法从我的存储库中获取。

是否有更简单的方法来检查所有子节点是否为空。 我的意思是,空的子节点可能存在,但没有值。

1 个答案:

答案 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,someevery 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:ifxsl:choose