#xml #xslt
#xml #xslt
Вопрос:
Учитывая input1.xml файл, создайте XSL-файл, который преобразует его в формат output1.xml .
input1.xml неужели это:
<?xml version="1.0" encoding="utf-8"?>
<Trips>
<tripID>75</tripID>
<tripID>79</tripID>
<tripID>85</tripID>
<tripID>88</tripID>
</Trips>
и output1.xml неужели это:
<?xml version="1.0" encoding="utf-8"?>
<TripsToPlan>
<ids>75,79,85,88</ids>
<numberofShifts>4</numberofShifts>
</TripsToPlan>
Как я могу это сделать?
Комментарии:
1. У вас есть конкретный вопрос или трудности? Или вы просто ищете кого-то, кто сделает за вас домашнее задание?
2. Я пытаюсь учиться самостоятельно, но я даже не знаю, с чего начать. Я просто хочу знать, какая часть кода что делает и как я могу это протестировать. Как вы можете видеть, это выглядит очень просто, но я даже не знаю, с чего начать.
3. Начните с любого учебника по XPath (например altova.com/training/xpath3 ), затем с помощью любого учебника по XSLT cranesoftwrights.github.io/books/ptux/index.htm .
Ответ №1:
Я использую расширение EXSLT для подсчета, не уверен, есть ли другой способ.
Этот XSLT применяется к вашему исходному XML:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exslt="http://exslt.org/common"
exclude-result-prefixes="exslt"
version="1.0">
<xsl:output indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="Trips"/>
</xsl:template>
<xsl:template match="Trips">
<TripsToPlan>
<ids>
<xsl:apply-templates select="tripID"/>
</ids>
<numberofShifts>
<xsl:call-template name="countLines">
<xsl:with-param name="nodes" select="tripID"/>
</xsl:call-template>
</numberofShifts>
</TripsToPlan>
</xsl:template>
<xsl:template match="tripID">
<xsl:value-of select="."/>
<xsl:if test="not(position() = last())">
<xsl:value-of select="','"/>
</xsl:if>
</xsl:template>
<xsl:template name="countLines">
<xsl:param name="nodes"/>
<xsl:value-of select="count(exslt:node-set($nodes))"/>
</xsl:template>
</xsl:stylesheet>
выдает этот вывод:
<?xml version="1.0" encoding="utf-8"?>
<TripsToPlan>
<ids>75,79,85,88</ids>
<numberofShifts>4</numberofShifts>
</TripsToPlan>
Просмотрите его, попытайтесь понять, что происходит, измените его и посмотрите, что произойдет.
Комментарии:
1. О, спасибо! Извините меня за мой вопрос noob, но как я могу его протестировать? лол
2. какую среду IDE вы используете? У меня есть «Oxygen XML editor». Существует также «Altova», но за них нужно платить. для XSLT есть плагин «Eclipse», не уверен, есть ли он для «IntelliJ Idea». Попробуйте те, которые я бы сказал. Есть онлайн-инструменты для выполнения преобразований XSLT, но, честно говоря, я бы получил IDE.
3. Зачем все это усложнение именованного шаблона, параметра, а затем даже использование
exsl:node-set
if все, что вы хотите<numberofShifts><xsl:value-of select="count(tripID)"/></numberofShifts>
?4. милый Мартин, видишь ли, мне нравится все усложнять 🙂