Я только начал изучать XSL, и мне нужно выполнить несколько упражнений

#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. милый Мартин, видишь ли, мне нравится все усложнять 🙂