2014-12-12 2 views
0

Я использую XSLT для создания CSV-файла из XML-файла.Строка Манипуляция с использованием XSLT

В настоящее время мой файл XML выглядит

<VWSRecipeFile> 
<PDCScaling User="" Version="1.0" Description="PDCTesting" LastChange="41984.7673783102"> 
    <Values> 
     <Ch1_MLC_Application_GVLPDC_PDC_Body_Sca_GrossWeightTopFlash_Set Item="Upper flash_set" Unit="kg" Type="4" Hex="00000000" Value="0"/> 
     <Ch1_MLC_Application_GVLPDC_PDC_Body_Sca_GrossWeightTopFlash_Act Item="Upper flash_act" Unit="kg" Type="4" Hex="00000000" Value="0"/> 
     <Ch1_MLC_Application_GVLPDC_PDC_Body_Sca_GrossWeightTopFlash_TolUpp Item="Upper flash_max" Unit="kg" Type="4" Hex="00000000" Value="0"/>    
    </Values> 
</PDCScaling> 
</VWSRecipeFile> 

И мой 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="text" indent="no"/> 

<xsl:template match="/VWSRecipeFile"> 

    <xsl:for-each select="PDCScaling/Values/*"> 
    <xsl:value-of select="concat(@Item,';')" /> 
    </xsl:for-each> 

    <xsl:text>&#xA;</xsl:text> 

    <xsl:for-each select="PDCScaling/Values/*"> 
    <xsl:value-of select="concat(@Unit,';')" /> 
    </xsl:for-each> 

    <xsl:text>&#xA;</xsl:text> 

    <xsl:for-each select="PDCScaling/Values/*"> 
    <xsl:value-of select="concat(@Value,';')" /> 
    </xsl:for-each> 

    <xsl:text>&#xA;</xsl:text> 
</xsl:template> 
</xsl:stylesheet> 

Теперь есть изменения в XML-файле, и это выглядит как

<VWSRecipeFile> 
<PDCScaling User="" Version="1.0" Description="PDCTesting" LastChange="41984.7673783102"> 
    <Values> 
     <Ch1_MLC_Application_GVLPDC_PDC_Body_Sca_GrossWeightTopFlash_Set Item="Upper flash_set_kg" Type="4" Hex="00000000" Value="0"/> 
     <Ch1_MLC_Application_GVLPDC_PDC_Body_Sca_GrossWeightTopFlash_Act Item="Upper flash_act_kg" Type="4" Hex="00000000" Value="0"/> 
     <Ch1_MLC_Application_GVLPDC_PDC_Body_Sca_GrossWeightTopFlash_TolUpp Item="Upper flash_max_kg" Type="4" Hex="00000000" Value="0"/>   
    </Values> 
</PDCScaling> 
</VWSRecipeFile> 

Что изменилось в , в текущем файле «Item» и «Unit» объединяются и передаются как «Item_unit». Я хочу создать тот же результат, что и раньше. Для чего перед созданием CSV мне нужно разбить «Item» на «Item» и «Unit», а затем создать CSV. Может ли кто-нибудь сказать мне эффективный способ сделать это. Любая помощь приветствуется

+0

* «дается как„Item_unit“*» В вашем примере, вы показываете «it_em_unit», т.е. символом _ не только разделяет элемент и единицу, но также может отображаться в имени элемента. Это верно? –

+0

Да, но «_» также присутствовал в предыдущем значении «item». В новом сценарии «Item» и «Unit» сгруппированы/объединены с помощью «_» – akshat

+1

Ну, это не умное изменение. Он вводит излишнюю сложность и создает больше возможностей для ошибок. В любом случае, Том дал вам ответ ниже. –

ответ

0

Возьмите substring-before-last функцию from an older answer of mine и использовать его как это:

<xsl:for-each select="PDCScaling/Values/*"> 
    <xsl:call-template name="substring-before-last"> 
    <xsl:param name="string1" select="@Value" /> 
    <xsl:param name="string2" select="'_'" /> 
    </xsl:call-template> 
    <xsl:text>;</xsl:text> 
</xsl:for-each> 
Смежные вопросы