2014-01-23 139 views
0

我正在嘗試使用XSLT來管理應用程序中的驗證處理。我嘗試了很多方法,包括定義模板匹配和遍歷模式中的屬性集。這是一個示例輸入文件,其中包含驗證元素,該元素定義了應該對父代元素屬性執行的操作,它們是後代。XSLT轉換使用多個子元素來處理父元素

例..

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. 對於效應「截斷屬性」對應的Parent中的屬性應截斷爲Extra1字符

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. 姓氏屬性被截斷至5個字符
  2. 的種族和民族屬性被拆除

謝謝你的任何方向!

+1

請至少顯示您嘗試過的衆多方法之一。這使得更容易指出你出錯的地方。 –

+1

很遺憾你編輯了你定義規則的屬性。 –

+0

*「種族和種族屬性已被刪除」*正如@MathiasMüller所指出的那樣,目前形式的問題沒有意義,因爲這些屬性並不在首位。另外,請說明是否可能有*其他*元素可能攜帶''需要處理的兒童。 –

回答

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> 

在這裏,我只處理「截斷」規則明確 - 「刪除」規則是因爲我忽略了驗證規則所涵蓋的任何屬性。

+0

感謝您的快速反饋。我目前正在開會會很快測試。 – cbondeson

+0

如果我沒有弄錯,轉換後「種族」和「種族」屬性仍然存在。 –

+0

@MathiasMüller它們不應該是 - 我不復制與_any_驗證規則相匹配的屬性,並且對「刪除」規則我什麼都不做。這兩個事實應該結合起來,壓制「種族」和「種族」屬性。 –