У меня есть 1 большой xml-файл, состоящий из 2 разных xml-файлов. Что я хочу сделать, когда я создаю CSV-файл, я хочу, чтобы иметь возможность захватывать данные из второй части файла, которая соответствует первой части. Я использую a для каждого цикла для прохождения всех данных в первой части файла, а затем вложенного цикла для захвата соответствующих данных. Вот XML макет:Шаблон вызова с параметром и значением вывода - XSLT
<?xml version="1.0" encoding="UTF-8"?>
<Report_Data>
<Report_Entry>
<company_id>001</company_id>
<dept>TestDept</dept>
</Report_Entry>
<Report_Entry>
</Report_Entry>
<Company_Data>
<Report_Entry>
<code>1</code>
<name>Test1</name>
</Report_Entry>
<Report_Entry>
<code>2</code>
<name>Test2</name>
</Report_Entry>
</Company_Data>
</Report_Data>
Что я хотел бы в моем CSV должен иметь имя от узла Company_Data вставленного в выходной сразу после company_id.
Вот мой XSL файл (в настоящее время он не работает, он перебирает и выводит N/A для каждого узла данных компании в выходном файле):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wd="urn:com.workday/bsvc">
<xsl:output method="text" encoding="utf-8" media-type="text/plain" />
<xsl:strip-space elements="*"/>
<xsl:variable name="newline" select="'
'" />
<xsl:variable name="tab" select="'	'" />
<xsl:variable name="comma" select="','" />
<xsl:variable name="padding" select="' '" />
<xsl:variable name="ID" select="concat('COMPANY ID', $padding)" />
<xsl:variable name="NAME" select="concat('COMPANY NAME', $padding)" />
<xsl:variable name="DEPT" select="concat('DEPARTMENT', $padding)" />
<xsl:template match="/">
<xsl:value-of select="$ID"/><xsl:value-of select="$comma"/>
<xsl:value-of select="$NAME"/><xsl:value-of select="$comma"/>
<xsl:value-of select="$DEPT"/><xsl:value-of select="$comma"/>
<xsl:for-each select="/Report_Data/Report_Entry">
<xsl:value-of select="translate(substring(concat(company_id, $padding), 1, string-length($ID)), ',', ' ')" /><xsl:value-of select="$comma"/>
<xsl:call-template name="company_name">
<xsl:with-param name="id_number" select="company_id"></xsl:with-param>
</xsl:call-template>
<xsl:value-of select="translate(substring(concat(dept, $padding), 1, string-length($DEPT)), ',', ' ')" /><xsl:value-of select="$comma"/>
</xsl:for-each>
</xsl:template>
<xsl:template name="company_name" match="/wd:Report_Data/wd:Company_Data">
<xsl:param name="id_number"></xsl:param>
<xsl:for-each select="/wd:Report_Entry">
<xsl:if test="contains($id_number, code)">
<xsl:value-of select="/name/text()"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Мой результат выглядит следующим образом:
1, TestDept
Вместо того, чтобы:
1, Test1, TestDept
Это не выводит значение name
. Как я могу отобразить это значение?
Я могу добавить материал, если вам нужна дополнительная информация.
спасибо. Ваш первый метод с использованием переменной работал. – RXC