2015-03-31 3 views
0

Мне нужно преобразовать xml-файл в csv-файл. Поэтому я использую msxsl. XML-файл выглядит следующим образом:преобразование xml через xsl (msxsl)

(...) 
<Test> 
    <Field1>Blabla</Field1> 
    <Values> 
    <Year>2012</Year> 
    <Value>12</Value> 
    </Values> 
    <Values> 
    <Year>2013</Year> 
    <Value>1234</Value> 
    </Values> 
    <Field2>abc</Field2> 
</Test> 

<Test> 
    <Field1>Blubblub</Field1> 
    <Field2>def</Field2> 
</Test> 
(...) 

Что означает: Есть наборы данных «Test» с несколькими узлами «ценности», и другие, без какой-либо.

Я попытался решить эту проблему с за-каждый:

(...) 
<xsl:for-each select="Test"> 
(...) 
<xsl:for-each select="Values"> 
(...) 
</xsl:for-each> 
</xsl:for-each> 
(...) 

Это работает (в некотором смысле), но число colums не соответствует между наборами данных. Мне нужно, чтобы в каждом наборе данных было максимальное количество колонок для каждого узла во всем файле.

В конце концов, вы должны иметь возможность открыть csv-файл с помощью excel. Поэтому каждый столбец должен содержать одни и те же данные ... есть ли способ сделать это?

Спасибо!

Edit: В этом случае ожидаемый CSV-выход будет выглядеть следующим образом:

Blabla;2012;12;2013;1234;abc 
Blubblub;;;;;def 

... и НЕ:

Blabla;2012;12;2013;1234;abc 
Blubblub;def 
+0

Возможно, это было бы яснее, если бы мы могли видеть ожидаемый результат преобразования примера. –

+0

excel откроет xml-файл, может все еще понадобиться преобразование, но это может быть менее болезненным. –

+0

Я добавил ожидаемый вывод csv. Excel не может открыть эти xml-файлы. Мы не знаем, почему - использование msxsl является альтернативным решением ... – Forangar

ответ

0

Учитывая ваш ожидаемый результат CSV (на самом деле ПОК, semicolon- разделенные значения, кажется), я не думаю, что вам нужен внутренний for-each. Я бы сделал это больше в соответствии с:

<xsl:for-each select="Test"> 
    <xsl:value-of select="Field1"/> 
    <xsl:text>;</xsl:text> 
    <xsl:value-of select="Values[1]/Year"/> 
    <xsl:text>;</xsl:text> 
    <xsl:value-of select="Values[1]/Value"/> 
    <xsl:text>;</xsl:text> 
    <xsl:value-of select="Values[2]/Year"/> 
    <xsl:text>;</xsl:text> 
    <xsl:value-of select="Values[2]/Value"/> 
    <xsl:text>;</xsl:text> 

    <!-- etc, up to the final... --> 

    <xsl:value-of select="Field2"/> 
</xsl:for-each> 

Это дает вам фиксированное количество полей с пустыми значениями, где ни один узел не существует.

+0

Вы считаете, что максимальное количество элементов '' в '' известно и может быть жестко закодировано. –

+0

Да, я, потому что он должен иметь «Field2» в постоянном столбце CSV, и это произойдет, только если максимум известен заранее. – bjimba

+0

Я предполагаю, что поле «Field2» должно быть ** последним ** столбцом - не обязательно постоянным для всех преобразованных документов. Но это для ОП, чтобы уточнить. –

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