2016-11-04 4 views
0

Я новичок в XSLT и XML, и я не могу правильно преобразовать. Используя примеры из сети, я либо теряю теги или узлы (я не уверен в терминологии), либо они дублируются. Ниже приведены образцы ввода и желаемого вывода.XSLT Transformation не может получить правильное количество тегов/узлов

Вход:

<?xml version="1.0" encoding="UTF-8"?> 
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2016-11-04T15:53:41"> 
<ActualKPIDay> 
<XrefCode>Etobicoke</XrefCode> 
<DayId>2016-11-03</DayId> 
<KpiId>122</KpiId> 
<Value>4418.88</Value> 
</ActualKPIDay> 
<ActualKPIDay> 
<XrefCode>Etobicoke</XrefCode> 
<DayId>2016-11-03</DayId> 
<KpiId>121</KpiId> 
<Value>44.35</Value> 
</ActualKPIDay> 
<ActualKPIDay> 
<XrefCode>Whitby</XrefCode> 
<DayId>2016-11-03</DayId> 
<KpiId>121</KpiId> 
<Value>46.75</Value> 
</ActualKPIDay> 
</dataroot> 

Желаемая Выход:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ActualKPIDayImport> 
    <ActualKPIDay> 
    <XrefCode>Etobicoke</XrefCode> 
    <DayId>2016-11-03</DayId> 
    <KpiId>122</KpiId> 
    <Value>4418.88</Value> 
    </ActualKPIDay> 
    <ActualKPIDay> 
    <XrefCode>Etobicoke</XrefCode> 
    <DayId>2016-11-03</DayId> 
    <KpiId>121</KpiId> 
    <Value>44.35</Value> 
    </ActualKPIDay> 
    <ActualKPIDay> 
    <XrefCode>Whitby</XrefCode> 
    <DayId>2016-11-03</DayId> 
    <KpiId>121</KpiId> 
    <Value>46.75</Value> 
    </ActualKPIDay> 
</ActualKPIDayImport> 

Моя последняя попытка привела покинуть линию "DataRoot" и дублируя "ActualKPIDay" метки до и после каждой записи:

Попытка:

результат

Выхода:

<?xml version="1.0"?> 
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata"> 
<ActualKPIDayImport> 
<ActualKPIDay> 
<ActualKPIDay> 
<XrefCode>Etobicoke</XrefCode> 
<DayId>2016-11-03T00:00:00</DayId> 
<KpiId>122</KpiId> 
<Value>4418.88</Value> 
</ActualKPIDay> 
</ActualKPIDay> 
<ActualKPIDay> 
<ActualKPIDay> 
<XrefCode>Etobicoke</XrefCode> 
<DayId>2016-11-03T00:00:00</DayId> 
<KpiId>121</KpiId> 
<Value>44.35</Value> 
</ActualKPIDay> 
</ActualKPIDay> 
<ActualKPIDay> 
<ActualKPIDay> 
<XrefCode>Georgetown</XrefCode> 
<DayId>2016-11-03T00:00:00</DayId> 
<KpiId>121</KpiId> 
<Value>425.29</Value> 
</ActualKPIDay> 
</ActualKPIDay> 
</ActualKPIDayImport> 
</dataroot> 

Надеется, что вы можете помочь.

+0

Почему вы не публикуете ваши попытки, чтобы мы могли исправить это, вместо того, чтобы писать код для вас из царапина. –

ответ

0

Просто удалить последний шаблон и вынимают <xsl:copy> теги шаблона DataRoot:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:strip-space elements="*"/> 
<xsl:output indent="yes"/> 

<xsl:template match="@*|node()"> 
    <xsl:element name="{local-name()}"> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="dataroot" priority="1"> 
    <ActualKPIDayImport> 
    <xsl:apply-templates/> 
    </ActualKPIDayImport> 
</xsl:template> 

    <xsl:template match="text()" priority="2"> 
    <xsl:copy/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

@GregK - см. Обновленную версию XSLT для выделения пространств имен на выходе. – Parfait

+0

Я не исповедую, чтобы понять код, но работал как шарм. –

+0

Отлично! В принципе, первый шаблон, основанный на шаблоне идентификатора, извлекает только локальное имя узла, оставляющего специальные пространства имен. Последний шаблон возвращает только текстовые значения из узлов с текстовыми значениями. – Parfait