我正在尝试使用XSLT来管理应用程序中的验证处理。我尝试了很多方法,包括定义模板匹配和迭代模式中的属性集。下面是一个示例输入文件,其中包含Validation元素,这些元素定义了应该对它们后代的Parent元素属性执行的操作。
实施例..
<PartyDefinition Suffix="" Religion="" Race="" PrimaryLanguage="" Prefix="" MiddleName="" LastName="Zztestpw" Gender="Female" FirstName="Ghlab" Ethnicity="" Degree="" DeathDate="" BirthDate="19670707000000">
<Validation ProductCode="eHARS VL" Extra3="" Extra2="" Extra1="" Element="PartyDefinition" Effect="Remove Attribute" Cause="Lookup Value Empty" Attribute="Race" Action="No Action"/>
<Validation ProductCode="eHARS VL" Extra3="" Extra2="" Extra1="5" Element="PartyDefinition" Effect="Truncate Field" Cause="Field exceeded size limit" Attribute="LastName" Action="No Action">Zztestpw</Validation>
<Validation ProductCode="eHARS VL" Extra3="" Extra2="" Extra1="" Element="PartyDefinition" Effect="Remove Attribute" Cause="Lookup Value Empty" Attribute="Ethnicity" Action="No Action"/>
<ExternalIDDefinition ExternalIDType="MR" ExternalID="2144448"/>
<ExternalIDDefinition ExternalIDType="PI" ExternalID="3932558"/>
<ExternalIDDefinition ExternalIDType="" ExternalID=""/>
</PartyDefinition>
<PartyDefinition Suffix="" Religion="" PrimaryLanguage="" Prefix="" MiddleName="" LastName="Zztes" Gender="Female" FirstName="Ghlab" Degree="" DeathDate="" BirthDate="19670707000000">
<ExternalIDDefinition ExternalIDType="MR" ExternalID="2144448"/>
<ExternalIDDefinition ExternalIDType="PI" ExternalID="3932558"/>
<ExternalIDDefinition ExternalIDType="" ExternalID=""/>
</PartyDefinition>
感谢您的指示!
答案 0 :(得分:0)
像往常一样,“对原始样式表进行一些更改”,你应该从身份转换开始
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>
将产生输入的副本。现在开始为要更改的内容添加模板。您想要删除验证元素:
<xsl:template match="Validation" />
并且对于PartyDefinition
,您希望遵循这些元素定义的规则:
<xsl:template match="PartyDefinition">
<!-- save for reference inside the for-each -->
<xsl:variable name="party" select="." />
<xsl:copy>
<xsl:for-each select="Validation[@Effect='Truncate Field']">
<xsl:attribute name="{@Attribute}">
<!-- truncate original value -->
<xsl:value-of select="substring($party/@*[local-name() = current()/@Attribute], 1, @Extra1)" />
</xsl:attribute>
</xsl:for-each>
<!-- include all attributes that aren't covered by validation rules -->
<xsl:apply-templates select="@*[not(current()/Validation/@Attribute = local-name())]" />
<!-- and process all children -->
<xsl:apply-templates select="node()" />
</xsl:copy>
</xsl:template>
这里我只是明确地处理“截断”规则 - 我忽略了验证规则所涵盖的任何属性,因此可以满足“删除”规则。