#xml #xslt #cast-iron
#xml #xslt #чугунный
Вопрос:
У меня есть 3 разных XML-файла. Некоторые столбцы из них общие, а некоторые нет. И их порядковое расположение меняются. Каждый раз я получаю новый файл на своем ftp, и мне нужно читать один за другим и загружать в систему. Но я не знаю об именах столбцов файла.
XML 1 :
<?xml version="1.0" encoding="UTF-8"?>
<SourceFile>
<Data>
<CustNo>126</CustNo>
<Gender/>
<isActive>0</isActive>
<Email/>
</Data>
</SourceFile>
XML 2 :
<?xml version="1.0" encoding="UTF-8"?>
<SourceFile>
<Data>
<CustNo>124</CustNo>
<Phone/>
<Country/>
<isActive>1</isActive>
</Data>
</SourceFile>
XML 3:
<?xml version="1.0" encoding="UTF-8"?>
<SourceFile>
<Data>
<KeyId>123</KeyId>
<FirstName/>
<LastName/>
<Email/>
<isActive>0</isActive>
</Data>
</SourceFile>
Я очень новичок в XSLT. Я хочу генерировать вывод ниже всякий раз, когда файл поступает на мой ftp.
Result for XML 1 :
<?xml version="1.0" encoding="UTF-8"?>
<SourceFile>
<Data>
<KeyID>124</KeyID> <!-- CustNo will be mapped to KeyId -->
<FirstName/>
<LastName/>
<Email/>
<Phone/>
<Country/>
<isActive>0</isActive>
</Data>
</SourceFile>
Большое спасибо,
Мехмет
Ответ №1:
Предполагая, что вы всегда хотите, чтобы все перечисленные элементы присутствовали в выходных данных (заполненных или нет), и что вы хотите, чтобы они были в заданном порядке, вы могли бы сделать:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/SourceFile">
<xsl:copy>
<xsl:for-each select="Data">
<xsl:copy>
<KeyID>
<xsl:value-of select="CustNo | KeyId"/>
</KeyID>
<FirstName>
<xsl:value-of select="FirstName"/>
</FirstName>
<LastName>
<xsl:value-of select="LastName"/>
</LastName>
<Email>
<xsl:value-of select="Email"/>
</Email>
<Phone>
<xsl:value-of select="Phone"/>
</Phone>
<Country>
<xsl:value-of select="Country"/>
</Country>
<isActive>
<xsl:value-of select="isActive"/>
</isActive>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Ответ №2:
Одна попытка будет:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="Data">
<xsl:copy>
<KeyID><xsl:value-of select="CustNo | KeyId"/></KeyID>
<FirstName><xsl:value-of select="FirstName"/></FirstName>
<Email><xsl:value-of select="Email"/></Email>
<Phone><xsl:value-of select="Phone"/></Phone>
<Country><xsl:apply-templates select="Country"/></Country>
<isActive><xsl:value-of select="isActive"/></isActive>
</xsl:copy>
</xsl:template>
<xsl:template match="Country">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Объяснение:
На элементе Data
вы всегда создаете ожидаемый результат. Например KeyID
, FirstName
, и так далее .. Всякий раз, когда выбор либо <xsl:value-of
или <xsl:apply-templates
совпадает, вы получаете содержимое узла.
<xsl:value-of />
просто возвращает строку элемента.
<xsl:apply-templates />
в конечном итоге будут выполняться и другие правила шаблонов! Это важно, например, если у вас есть дочерние узлы. Вы видите это в примере для элемента Country
.
XML и XSLT чувствительны к регистру.