2014-10-27 4 views
1

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

Вот пример входного файла XML ...

<?xml version="1.0" encoding="utf-8" ?> 
<RepeaterData> 
    <Version /> 
    <Items> 
    <Item> 

     <response type="System.String">xxx</response> 
     <response_date type="System.String" /> 
     <digital_signature_field_profile_name type="System.String">tester3_Dianne</digital_signature_field_profile_name> 
     <approver_role type="System.String">tester3</approver_role> 
     <approver_workflow_group type="System.Int32">3</approver_workflow_group> 
     <approver_workflow_sequence_in_group type="System.Int32">2</approver_workflow_sequence_in_group> 

    </Item> 
    <Item> 

     <response type="System.String">xxx</response> 
     <response_date type="System.String" /> 
     <digital_signature_field_profile_name type="System.String">tester2_Ben</digital_signature_field_profile_name> 
     <approver_role type="System.String">tester2</approver_role> 
     <approver_workflow_group type="System.Int32">1</approver_workflow_group> 
     <approver_workflow_sequence_in_group type="System.Int32">3</approver_workflow_sequence_in_group> 
    </Item> 
    <Item> 

     <response type="System.String" /> 
     <response_date type="System.String" /> 
     <digital_signature_field_profile_name type="System.String">tester1_Greg</digital_signature_field_profile_name> 
     <approver_role type="System.String">tester1</approver_role> 
     <approver_workflow_group type="System.Int32">4</approver_workflow_group> 
     <approver_workflow_sequence_in_group type="System.Int32">1</approver_workflow_sequence_in_group> 
    </Item> 
    <Item> 

     <response type="System.String" /> 
     <response_date type="System.String" /> 

     <digital_signature_field_profile_name type="System.String">tester4_Erin</digital_signature_field_profile_name> 
     <approver_role type="System.String">tester4</approver_role> 
     <approver_workflow_group type="System.Int32">3</approver_workflow_group> 
     <approver_workflow_sequence_in_group type="System.Int32">2</approver_workflow_sequence_in_group> 
    </Item> 
    <Item> 

     <response type="System.String" /> 
     <response_date type="System.String" /> 
     <digital_signature_field_profile_name type="System.String">tester5_Sherry</digital_signature_field_profile_name> 
     <approver_role type="System.String">tester5</approver_role> 
     <approver_workflow_group type="System.Int32">3</approver_workflow_group> 
     <approver_workflow_sequence_in_group type="System.Int32">1</approver_workflow_sequence_in_group> 
    </Item> 
    </Items> 
</RepeaterData> 

Вот пример файла желаемый выходной XML (если фильтр на ответ не пустой/пустой) ...

<?xml version="1.0" encoding="utf-8"?> 
<RepeaterData> 
<Version /> 
<Items> 
<Item> 
    <response type="System.String">xxx</response> 
    <response_date type="System.String" /> 
    <digital_signature_field_profile_name type="System.String">tester3_Dianne</digital_signature_field_profile_name> 
    <approver_role type="System.String">tester3</approver_role> 
    <approver_workflow_group type="System.Int32">3</approver_workflow_group> 
    <approver_workflow_sequence_in_group type="System.Int32">2</approver_workflow_sequence_in_group> 
</Item> 
<Item> 
    <response type="System.String">xxx</response> 
    <response_date type="System.String" /> 
    <digital_signature_field_profile_name type="System.String">tester2_Ben</digital_signature_field_profile_name> 
    <approver_role type="System.String">tester2</approver_role> 
    <approver_workflow_group type="System.Int32">1</approver_workflow_group> 
    <approver_workflow_sequence_in_group type="System.Int32">3</approver_workflow_sequence_in_group> 
</Item> 
</Items> 
</RepeaterData> 

с некоторым усилием я создал этот XSLT ...

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:template match="/"> 
    <xsl:for-each select="/"> 
     <xsl:copy-of select ="RepeaterData/Items/Item[response != '']"/> 
    </xsl:for-each> 
</xsl:template > 
</xsl:stylesheet> 

Но это создает файл XML с отсутствующими узлами. Узлы missig - «RepeaterData», «Version» и «Items».

<?xml version="1.0" encoding="utf-8"?> 
<Item> 
    <response type="System.String">xxx</response> 
    <response_date type="System.String" /> 
    <digital_signature_field_profile_name type="System.String">tester3_Dianne</digital_signature_field_profile_name> 
    <approver_role type="System.String">tester3</approver_role> 
    <approver_workflow_group type="System.Int32">3</approver_workflow_group> 
    <approver_workflow_sequence_in_group type="System.Int32">2</approver_workflow_sequence_in_group> 
</Item> 
<Item> 
    <response type="System.String">xxx</response> 
    <response_date type="System.String" /> 
    <digital_signature_field_profile_name type="System.String">tester2_Ben</digital_signature_field_profile_name> 
    <approver_role type="System.String">tester2</approver_role> 
    <approver_workflow_group type="System.Int32">1</approver_workflow_group> 
    <approver_workflow_sequence_in_group type="System.Int32">3</approver_workflow_sequence_in_group> 
</Item> 

Казалось бы, есть общий способ построения XSLT-фильтр без необходимости вручную вставлять эти недостающие узлы в XSLT для вывода.

Я просмотрел образцы, но не смог найти то, что в основном возвращает один и тот же файл XML без нежелательных данных.

Привет Бен

ответ

0

Используйте этот XSLT, она игнорирует Item с, что имеет пустые response элементы.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

<xsl:template match="Item[normalize-space(response) = '']"/> 

    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Выход:

<?xml version="1.0" encoding="utf-8"?> 
<RepeaterData> 
    <Version /> 
    <Items> 
    <Item> 

     <response type="System.String">xxx</response> 
     <response_date type="System.String" /> 
     <digital_signature_field_profile_name type="System.String">tester3_Dianne</digital_signature_field_profile_name> 
     <approver_role type="System.String">tester3</approver_role> 
     <approver_workflow_group type="System.Int32">3</approver_workflow_group> 
     <approver_workflow_sequence_in_group type="System.Int32">2</approver_workflow_sequence_in_group> 

    </Item> 
    <Item> 

     <response type="System.String">xxx</response> 
     <response_date type="System.String" /> 
     <digital_signature_field_profile_name type="System.String">tester2_Ben</digital_signature_field_profile_name> 
     <approver_role type="System.String">tester2</approver_role> 
     <approver_workflow_group type="System.Int32">1</approver_workflow_group> 
     <approver_workflow_sequence_in_group type="System.Int32">3</approver_workflow_sequence_in_group> 
    </Item> 



    </Items> 
</RepeaterData> 
+1

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

0

Мне нужно преобразовать XML-файл другой XML файл, но отфильтровывать некоторые ненужные записи. Выходной файл XML должен иметь точный узел структуры входного XML-файла.

Это обычное требование. Обычно его решают, начиная с identity transform template, копировать все как есть, а затем добавлять специальные шаблоны для подавления узлов, которые вы хотите исключить.

+0

Это в сочетании со следующим ответом имеет смысл. –

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