2014-01-23 4 views
0

Я пытаюсь использовать XSLT для управления обработкой проверки в приложении. Я пробовал множество методов, включая определение совпадений шаблонов и итерацию с помощью наборов атрибутов в схеме. Вот пример входного файла, который содержит элементы проверки, которые определяют, что должно быть сделано с атрибутами родительского элемента, которые они являются потомками.XSLT Transform для использования нескольких дочерних элементов для обработки родительских элементов

Пример ..

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

XML Ouput

<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. The расы и этнической принадлежности атрибуты были удалены

Спасибо за любую сторону!

+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

Если я не ошибаюсь, атрибуты 'Race' и' Ethnicity' все еще присутствуют после преобразования. –

+0

@ MathiasMüller Их не должно быть - я не копирую атрибуты, которые соответствуют правилу _any_ validation, и я вообще ничего не делаю для «удаления» правил. Эти два факта должны сочетаться, чтобы подавить атрибуты «Раса» и «Этничность». –

Смежные вопросы