попытка добавить элемент в xml с помощью XSLT и присвоить ему значение

#xml #xslt

Вопрос:

У меня есть xml — файл, в который я хочу добавить элемент = носитель и присвоить ему значение = ABF. исходный файл выглядит следующим образом

 <?xml version="1.0"?> 
<ABF>
<QUOTEID>L9V5442611</QUOTEID>
<CHARGE>166.08</CHARGE> 
<ADVERTISEDTRANSIT>1 Day</ADVERTISEDTRANSIT>

 

я использую этот файл xslt ниже, чтобы внести следующие изменения

1 — добавьте QUOTETENDER в качестве начального и конечного элементов. 2 — удалите ABF 3 — вставьте НЕСУЩИЙ элемент и присвойте ему значение ABF

я смог достичь 1 и 2, но не могу выполнить 3

результат, который мне нужен, — это фрагмент xml внизу

… может кто-нибудь помочь … спасибо

 <?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="no"/> 

    <xsl:template match="ABF">
        <xsl:element name="QUOTETENDER">
            <xsl:element name="CARRIER"></xsl:element>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

 
 <?xml version="1.0" encoding="UTF-8"?>
<QUOTETENDER>
<CARRIER>ABF</CARRIER>
<QUOTEID>L9V5442611</QUOTEID>
<CHARGE>166.08</CHARGE>
<ADVERTISEDTRANSIT>1 Day</ADVERTISEDTRANSIT>
</QUOTETENDER>
 

Ответ №1:

Вам просто нужно добавить ABF внутри НЕСУЩЕГО элемента:

 <xsl:element name="CARRIER">ABF</xsl:element>
 

Вы могли бы упростить вещи и использовать буквальные объявления элементов, так как ваши имена элементов статичны и не определяются динамически:

 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output method="xml" indent="no"/> 
    
    <xsl:template match="ABF">
        <QUOTETENDER>
            <CARRIER>ABF</CARRIER>
            <xsl:apply-templates select="@*|node()"/>
        </QUOTETENDER>
    </xsl:template>
    
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
 

Вы также можете использовать local-name() соответствующий ABF элемент:

 <CARRIER><xsl:value-of select="local-name()"/></CARRIER>