У меня есть этот запрос ввода ниже. мы получим почти 10 тегов, содержащих информацию о книге и дате. Я хочу, чтобы каждая информация находилась между тегом <shop>
. Как мне написать это в xslt?
<soapenv:Envelope xmlns:soapenv = "http://schemas.xmlsoap.org/soap/envelope/" xmlns:p = "http://www.blah.com">
<soapenv:Header/>
<soapenv:Body>
<p:order>
<p:shop>
<p:Book>Guru</p:Book>
<p:date>12-2-2020</p:date>
<p:Book>jungle</p:Book>
<p:date>13-1-2023</p:date>
<p:Book>Sports</p:Book>
<p:date>13-1-2023</p:date>
</p:shop>
</p:order>
</soapenv:Body>
</soapenv:Envelope>
Ожидаемый результат:
<soapenv:Envelope xmlns:soapenv = "http://schemas.xmlsoap.org/soap/envelope/" xmlns:p = "http://www.blah.com">
<soapenv:Header/>
<soapenv:Body>
<p:order>
<p:shop>
<p:Author>Guru</p:Author>
<p:startdate>12-2-2020</p:startdate>
<p:shop>
<p:Author>jungle</p:Author>
<p:startdate>13-1-2023<p:/startdate>
<p:shop>
<p:Author>Sports</p:Author>
<p:startdate>13-1-2023</p:startdate>
</p:shop>
</p:order>
<e:shop>
</soapenv:Body>
</soapenv:Envelope>
Мой xslt:
<xsl:for-each select = "//Order">
<xsl:value-of select = "following-sibling::date[1]"/>
<p:Author>
<xsl:value-of select = "$Book"/>
</p:Author>
<p:StartDate>
<xsl:value-of select = "$date"/>
</p:StartDate>
</xsl:for-each>
Вывод, который вы показываете, не является правильно сформированным XML. Предполагая, что вы хотите получить результат:
<?xml version = "1.0" encoding = "UTF-8"?>
<soapenv:Envelope xmlns:soapenv = "http://schemas.xmlsoap.org/soap/envelope/" xmlns:p = "http://www.blah.com">
<soapenv:Header/>
<soapenv:Body>
<p:order>
<p:shop>
<p:Book>Guru</p:Book>
<p:date>12-2-2020</p:date>
</p:shop>
<p:shop>
<p:Book>jungle</p:Book>
<p:date>13-1-2023</p:date>
</p:shop>
<p:shop>
<p:Book>Sports</p:Book>
<p:date>13-1-2023</p:date>
</p:shop>
</p:order>
</soapenv:Body>
</soapenv:Envelope>
пытаться:
XSLT 1.0
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:p = "http://www.blah.com">
<xsl:output method = "xml" version = "1.0" encoding = "UTF-8" indent = "yes"/>
<xsl:strip-space elements = "*"/>
<!-- identity transform -->
<xsl:template match = "@*|node()">
<xsl:copy>
<xsl:apply-templates select = "@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match = "p:shop">
<xsl:for-each select = "p:Book">
<p:shop>
<xsl:copy-of select = ". | following-sibling::p:date[1]"/>
</p:shop>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Извините, я не понимаю проблемы. Возможно, вам нужно опубликовать еще один вопрос.
Я думаю, что я должен опубликовать еще один qquestion. Но я боюсь, что это может быть помечено как аналогичный вопрос и помечено. Опубликую еще один вопрос.
не должно ли что-то вроде этого быть достаточным?
<p:order>
<xsl:for-each select = "//p:order/p:shop/p:Book">
<p:shop>
<xsl:value-of select = "following-sibling::p:date[1]"/>
<p:Author>
<xsl:value-of select = "."/>
</p:Author>
<p:StartDate>
<xsl:value-of select = "following-sibling::p:date[1]"/>
</p:StartDate>
</p:shop>
</xsl:for-each>
</p:order>
производит
<?xml version = "1.0" encoding = "UTF-8"?>
<p:order xmlns:p = "http://www.blah.com">
<p:shop>12-2-2020
<p:Author>Guru</p:Author>
<p:StartDate>12-2-2020</p:StartDate>
</p:shop>
<p:shop>13-1-2023
<p:Author>jungle</p:Author>
<p:StartDate>13-1-2023</p:StartDate>
</p:shop>
<p:shop>13-1-2023
<p:Author>Sports</p:Author>
<p:StartDate>13-1-2023</p:StartDate>
</p:shop>
</p:order>
я удалил переменные, так как понятия не имею, как они объявлены в вашей таблице стилей.
Но Майкл, можем ли мы написать без использования шаблона? Мой xslt настолько длинный, что я лишь немного вставил в этот вопрос. Я получаю сообщение об ошибке, что шаблон нельзя использовать в качестве дочернего элемента. Есть ли другой способ, пожалуйста?