Не могли бы вы помочь мне с группировкой в xslt . Ввод.xml:
<EDI>
<Header/>
<Data>
<ISA> <Identifier>123</Identifier>
</ISA>
<Function>
<Transaction>
<BPR><Account> 123<Account></BPR>
<CUR><Code>USD</Code></CUR>
</Transaction>
<Transaction>
<BPR><Account> 123<Account></BPR>
<CUR><Code>EUR</Code></CUR>
</Transaction>
<Transaction>
<BPR><Account> 123<Account></BPR>
<CUR><Code>USD</Code></CUR>
</Transaction>
</Function>
</Data>
</EDI>
Я хочу сгруппировать входной xml на основе CUR/Code . Я также создал ключ и generateid, но в моем выходном xml он также отражает значение поля ISA перед выводом.
Выходной xml:
<Output>
<Filename>USAFile</Filename> (If the current-group has Code USD)
<EDI>
<Data><ISA><Identifier>12</Identifier></ISA>
<Function>
<Transaction>
<BPR><Account> 123<Account></BPR>
<CUR><Code>USD</Code></CUR>
</Transaction>
<Transaction>
<BPR><Account> 123<Account></BPR>
<CUR><Code>USD</Code></CUR>
</Transaction>
</Function>
</Data>
</EDI>
</Output>
<Output>
<Filename>EURFile</Filename> (If the current-group has Code EUR)
<EDI>
<Data><ISA><Identifier>23</Identifier></ISA>
<Function>
<Transaction>
<BPR><Account> 123<Account></BPR>
<CUR><Code>EUR/Code></CUR>
</Transaction>
</Data>
</EDI>
</Output>
XSLT:
<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" xmlns:tib = "http://www.tibco.com/bw/xslt/custom-functions" version = "1.0">
<xsl:output method = "xml" omit-xml-declaration = "yes" version = "1.0" encoding = "UTF-8" indent = "no"/>
<xsl:key name = "groups" match = "/EDI/Data/Function/Transaction" use = "CUR/Code" />
<xsl:template match = "Function">
<Function>
<xsl:for-each select = "Transaction[generate-id() = generate-id(key('groups', CUR/Code)[1])]"/>
<xsl:for-each select = "key('groups',CUR/Code)">
<Transaction>
<BR><Account><xsl:value-of select = "BPR/Account"/></Account>
<CUR><Code><xsl:value-of select = "CUR/Code"/></Code>
</Transaction>
</xsl:for-each>
</xsl:for-each>
</Function>
</xsl:template>
</xsl:stylesheet>
<xsl:key name = "groups" match = "/EDI/Data/Function/Transaction" use = "CUR/Code" /> <xsl:template match = "Function"> <Function> <xsl:for-each select = "Transaction[generate-id() = generate-id(key('groups', CUR/Code)[1])]"/> <xsl:for-each select = "key('groups',CUR/Code )"> <Transaction> <BR><Account><xsl:value-of select = "BPR/Account"/></Account> <CUR><Code><xsl:value-of select = "CUR/Code" /></Code> </Transaction> </xsl:for-each> </xsl:for-each> </Function> </xsl:template> </xsl:stylesheet>
Вышеупомянутое я проверил, чтобы проверить правильность группировки или нет. Но значение ISA предшествует структуре. Не могли бы вы помочь с xslt и дайте мне знать, где применить сопоставление шаблонов, когда нам требуется вышеуказанный желаемый результат. Спасибо .
Можете ли вы отредактировать свой вопрос, включив в него этот XSLT. Видите ли, трудно читать код в комментариях. Спасибо!
Я добавил xslt, но это не отражено в вопросе. Не могли бы вы взять xslt из комментария и вставить в notepad++. Надеюсь, что это поможет. Или вы могли бы помочь с xslt для желаемого вывода. Извините за xslt, не отражающий вопрос.
Пожалуйста, отредактируйте свой вопрос еще раз и уточните, какой результат вы хотите получить.
Я уже разместил входной и выходной xml. Группировку следует выполнять по полю CUR/Code. Если это «USD», то генерируется отдельный вывод, а если «EUR», то генерируется отдельный вывод. Пожалуйста помоги.
Ваш ожидаемый результат сформирован неправильно. В вашей таблице стилей отсутствуют некоторые инструкции, иначе она не сможет вывести то, что вы ожидаете.
Ожидаемый результат должен иметь 2 выходных сообщения на основе CUR/кода. Может ли кто-нибудь объяснить мне, где я могу поместить применить шаблон и шаблон, чтобы получить желаемый результат.





Во-первых, сделайте ваш входной XML правильно сформированным, как показано ниже:
<?xml version = "1.0" encoding = "UTF-8"?>
<EDI>
<Header />
<Data>
<ISA>
<Identifier>123</Identifier>
</ISA>
<Function>
<Transaction>
<BPR>
<Account>
123
</Account>
</BPR>
<CUR>
<Code>USD</Code>
</CUR>
</Transaction>
<Transaction>
<BPR>
<Account>
123
</Account>
</BPR>
<CUR>
<Code>EUR</Code>
</CUR>
</Transaction>
<Transaction>
<BPR>
<Account>
123
</Account>
</BPR>
<CUR>
<Code>USD</Code>
</CUR>
</Transaction>
</Function>
</Data>
</EDI>
Используя немного другой подход, чем тот, который вы пробовали (в случае, если это нормально для вашего случая):
Примечание: В выходном XML вы показали два разных значения для <Identifier> в <ISA>. Я догадался, что это опечатка. Поправьте меня, если я что-то упустил.
<?xml version = "1.0" encoding = "utf-8"?>
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
<xsl:output method = "xml" indent = "yes" />
<xsl:strip-space elements = "*" />
<xsl:key name = "groups" match = "/EDI/Data/Function/Transaction" use = "CUR/Code" />
<xsl:template match = "Function">
<xsl:apply-templates mode = "group" />
</xsl:template>
<xsl:template match = "Transaction[count(. | key('groups',CUR/Code)[1]) = 1]" mode = "group">
<Output>
<Filename>
<xsl:choose>
<xsl:when test = "CUR/Code = 'USD'">
<xsl:value-of select = "'USAFile'" />
</xsl:when>
<xsl:when test = "CUR/Code = 'EUR'">
<xsl:value-of select = "'EURFile'" />
</xsl:when>
</xsl:choose>
</Filename>
<EDI>
<Data>
<ISA>
<Identifier>
<xsl:value-of select = "../preceding-sibling::*[1]" />
</Identifier>
</ISA>
<Function>
<Transaction>
<xsl:copy-of select = "key('groups',CUR/Code)" />
</Transaction>
</Function>
</Data>
</EDI>
</Output>
</xsl:template>
<xsl:template match = "ISA" />
<!-- remove nodes other than through the key -->
<xsl:template match = "node()" mode = "group" />
</xsl:stylesheet>
Можете ли вы показать XSLT, с которым у вас возникли проблемы, как будто вы используете
xsl:keyиgenerate-id, то вы, вероятно, недалеко от решения. Спасибо!