xsl-преобразование dataset.writexml XML
У меня есть сценарий, в котором я экспортирую набор данных.net в файл XML, но я хочу преобразовать структуру вывода XML в более иерархическую структуру. Ниже приведен формат набора данных, экспортируемый методом dataset.xmlwrite().
<NewDataSet>
<Table>
<id>100</id>
<empname>Joe Smith</empname>
<phone>111-111-1111</phone>
<mobile>222-222-2222</mobile>
</Table>
<Table>
<id>101</id>
<empname>Ann Jensen</empname>
<phone>111-111-0000</phone>
<mobile>222-222-0000</mobile>
</Table>
<NewDataSet>
Я хочу преобразовать это в структуру ниже. Я новичок в xsl transforms, и я не уверен, как сохранить <Table>
повторение элемента для каждой записи в наборе данных.
<NewDataSet>
<Table>
<employee id="100">
<empname>Joe Smith</empname>
<phone>111-111-1111</phone>
<mobile>222-222-2222</mobile>
</employee>
<employee id="101">
<empname>Ann Jensen</empname>
<phone>111-111-0000</phone>
<mobile>222-222-0000</mobile>
</employee>
</Table>
<NewDataSet>
Я пытался использовать комбинацию xsl: for-each и xsl: if, чтобы получить то, что я хотел, но до сих пор я не смог заставить его работать. Будем очень благодарны любой помощи.
2 ответа
Это преобразование:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Table[1]">
<Table>
<xsl:apply-templates select="../Table/id"/>
</Table>
</xsl:template>
<xsl:template match="Table[position()>1]"/>
<xsl:template match="Table/id">
<employee id="{.}">
<xsl:apply-templates select=
"following-sibling::node()"/>
</employee>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному документу XML (исправлено, чтобы быть правильно сформированным):
<NewDataSet>
<Table>
<id>100</id>
<empname>Joe Smith</empname>
<phone>111-111-1111</phone>
<mobile>222-222-2222</mobile>
</Table>
<Table>
<id>101</id>
<empname>Ann Jensen</empname>
<phone>111-111-0000</phone>
<mobile>222-222-0000</mobile>
</Table>
</NewDataSet>
дает желаемый, правильный результат:
<NewDataSet>
<Table>
<employee id="100">
<empname>Joe Smith</empname>
<phone>111-111-1111</phone>
<mobile>222-222-2222</mobile>
</employee>
<employee id="101">
<empname>Ann Jensen</empname>
<phone>111-111-0000</phone>
<mobile>222-222-0000</mobile>
</employee>
</Table>
</NewDataSet>
Пояснение:
Правило идентификации копирует каждый узел "как есть".
Первый
Table
элемент соответствует переопределяющему шаблону. Это создает толькоTable
в результате и применяет шаблоны для детей всехTable
элементы.id
элемент соответствует переопределяющему шаблону, который преобразует его вemployee
элемент, имеющийid
атрибут со значениемid
элемент. Это также относится к шаблонам изнутриemployee
элемент ко всем другим братьям и сестрамid
и они копируются как есть с помощью шаблона идентификации.
Это должно сработать
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<Table>
<xsl:for-each select="/NewDataSet/Table">
<employee>
<xsl:attribute name="id"><xsl:value-of select="id/."/></xsl:attribute>
<xsl:for-each select="*">
<xsl:choose>
<xsl:when test="name() = 'id' "/>
<xsl:otherwise>
<xsl:copy-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</employee>
</xsl:for-each>
</Table>
</xsl:template>
</xsl:stylesheet>