XSLT转换以使用多个子元素来处理父元素

时间:2014-01-23 14:23:45

标签: xml xslt

我正在尝试使用XSLT来管理应用程序中的验证处理。我尝试了很多方法,包括定义模板匹配和迭代模式中的属性集。下面是一个示例输入文件,其中包含Validation元素,这些元素定义了应该对它们后代的Parent元素属性执行的操作。

实施例..

XML输入

<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>
  1. 对于效果“删除属性”,应删除父项中的相应属性
  2. 对于效果“截断属性”,父级中的相应属性应截断为Extra1个字符
  3. XML输出

    <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>
    
    1. LastName属性被截断为5个字符
    2. 已删除种族和种族属性
    3. 感谢您的指示!

1 个答案:

答案 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>

这里我只是明确地处理“截断”规则 - 我忽略了验证规则所涵盖的任何属性,因此可以满足“删除”规则。