У меня есть два разных документа XML ниже:
XML 1
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
<Match>
<Trades>
<Trade fruitId = "apples"/>
</Trades>
</Match>
XML 2
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
<Match2>
<Properties>
<foobar>123</foobar>
</Properties>
<Trades>
<Trade vegetableId = "eggplant"/>
</Trades>
</Match2>
Я хотел бы создать один XSLT-документ, который в основном принимал бы значение внутри fruitId
или vegetableId
, в зависимости от того, какой из них доступен. XSLT должен удовлетворять как XML1, так и XML2.
Я не уверен, как к этому подойти, должен ли я создать оператор if, который проверяет, содержит ли этот тег Trades овощной или фруктовый идентификатор. Я немного потерялся здесь. Это то, что я придумал до сих пор.
МОЯ XSLT-ПОПЫТКА
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "xml" indent = "yes" omit-xml-declaration = "yes" />
<xsl:template match = "/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match = "Trades/Trade">
<xsl: if test = "(contains(@fruitId, 'somevalue'))">
<xsl:value-of select = "@fruitId"/>
</xsl:if>
<xsl: if test = "(contains(@vegetableId, 'somevalue'))">
<xsl:value-of select = "@vegetableId"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Я знаю, что в моем операторе contains есть «какое-то значение», это не реальный код, который я запускаю, а скорее идея того, что я думаю попробовать, хотя я не уверен, как подойти.
Кроме того, <Match>
отличается от <Match2>
.
Пожалуйста, порекомендуйте. Спасибо!
Вы можете просто использовать что-то вроде этого. В зависимости от документа, который вы передаете преобразованию, только один элемент функции concat() будет непустым, поэтому фактически в выводе будет присутствовать только одно значение.
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "xml" indent = "yes" omit-xml-declaration = "yes"/>
<xsl:strip-space elements = "*" />
<xsl:template match = "Trades/Trade">
<output><xsl:value-of select = "concat(@fruitId,@vegetableId)"/></output>
</xsl:template>
<xsl:template match = "text()"/>
</xsl:stylesheet>
Посмотрите, как это работает здесь (для проверки я объединил два файла): https://xsltfiddle.liberty-development.net/ei5R4up
Или просто
<xsl:value-of select = "@fruitId | @vegetableId"/>
.