Как вставить новый элемент, используя контент из родственных элементов, используя XSLT - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть некоторые существующие выходные данные XML, в которые мне нужно вставить новый элемент, который будет содержать как некоторые жестко закодированные данные, так и некоторые динамические данные, которые получены из значений двух родственных элементов.

Я пробовал несколько итераций этого, но не могу получить какой-либо значимый вывод

Ввод XML:

<ExportXML xmlns="http://www.taleo.com/ws/integration/toolkit/2005/07" 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:ns1="http://www.taleo.com/ws/integration/toolkit/2005/07" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <record>
                <field name="Client">Company X</field>
                <field name="TItle">Program Manager</field>
                <field name="ReqNumber">106839</field>
                <field name="JobBoardID">JB-10000</field>
                <field name="PostedDate">2019-04-03</field>
                <field name="City"></field>
                <field name="StateProvince"></field>
                <field name="Country">United States</field>
                <field name="Category">Professionals</field>
                <field name="JobText">Blah, blah, blah</field>
            </record>
            <record>
                <field name="Client">Company X</field>
                <field name="TItle">Director, Sales--Army</field>
                <field name="ReqNumber">106051</field>
                <field name="JobBoardID">JB-13262</field>
                <field name="PostedDate">2019-03-04</field>
                <field name="City"></field>
                <field name="StateProvince"></field>
                <field name="Country">United States</field>
                <field name="Category">Sales Workers</field>
                <field name="JobText">Blah, blah, blah</field>
            </record>
</ExportXML>

Требуемый вывод XML:

<ExportXML xmlns="http://www.taleo.com/ws/integration/toolkit/2005/07" 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:ns1="http://www.taleo.com/ws/integration/toolkit/2005/07" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <record>
                <field name="Client">Company X</field>
                <field name="TItle">Program Manager</field>
                <field name="ReqNumber">106839</field>
                <field name="JobBoardID">JB-10000</field>
                <field name="PostedDate">2019-04-03</field>
                <field name="City"></field>
                <field name="StateProvince"></field>
                <field name="Country">United States</field>
                <field name="Category">Professionals</field>
                <field name="JobText">Blah, blah, blah</field>
                <field name="ApplyURL">https://www.fakedomain.org/careersection/JB-10000/jobapply.ftl?lang=en&amp;job=106839</field>
            </record>
            <record>
                <field name="Client">Company X</field>
                <field name="TItle">Director, Sales--Army</field>
                <field name="ReqNumber">106051</field>
                <field name="JobBoardID">JB-13262</field>
                <field name="PostedDate">2019-03-04</field>
                <field name="City"></field>
                <field name="StateProvince"></field>
                <field name="Country">United States</field>
                <field name="Category">Sales Workers</field>
                <field name="JobText">Blah, blah, blah</field>
                <field name="ApplyURL">https://www.fakedomain.org/careersection/JB-13262/jobapply.ftl?lang=en&amp;job=106051</field>
            </record>
</ExportXML>

Как вы можете видеть в примере кода выше, я хотел бы добавить новый элемент "field" с атрибутом "ApplyURL", который принимает жестко закодированную строку (https://www.fakedomain.org/careersection/) объединяет это со значением элемент родственного поля с атрибутом «JobBoardID» объединяет его с жестко закодированной строкой «/jobapply.ftl?lang=en&job=» и объединяет его со значением элемента родственного поля с атрибутом «ReqNumber».

Мне нужно, чтобы это правило шаблона применялось ко всем узлам «записи», найденным в документе XML.

Я пробовал разные подходы для этого, но до сих пор не имел никакого успеха. Я новичок в XSLT, так что не удивительно. Я надеюсь, что кто-то, кто более опытен в этом, может помочь мне.

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Обратите внимание, что инструкции xsl:element и xsl:attribute полезны, когда их QName будет определяться динамически.В противном случае просто используйте буквальные элементы результата .

Эта таблица стилей

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
               xmlns:doc="http://www.taleo.com/ws/integration/toolkit/2005/07"
               xmlns="http://www.taleo.com/ws/integration/toolkit/2005/07"
               exclude-result-prefixes="doc"> 
   <xsl:template match="@*|node()">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template> 

   <xsl:template match="doc:record">
      <xsl:copy> 
        <xsl:apply-templates select="@*|node()"/>
        <field name="ApplyURL">
            <xsl:value-of 
            select="concat(
                'https://www.fakedomain.org/careersection/',
                doc:field[@name='JobBoardID'],
                '/jobapply.ftl?lang=en&amp;job=',
                doc:field[@name='ReqNumber'])" />
        </field>
      </xsl:copy>
   </xsl:template> 
</xsl:stylesheet>

Вывод:

<ExportXML  xmlns="http://www.taleo.com/ws/integration/toolkit/2005/07" 
            xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns:ns1="http://www.taleo.com/ws/integration/toolkit/2005/07" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <record>
                <field name="Client">Company X</field>
                <field name="TItle">Program Manager</field>
                <field name="ReqNumber">106839</field>
                <field name="JobBoardID">JB-10000</field>
                <field name="PostedDate">2019-04-03</field>
                <field name="City"/>
                <field name="StateProvince"/>
                <field name="Country">United States</field>
                <field name="Category">Professionals</field>
                <field name="JobText">Blah, blah, blah</field>
                <field name="ApplyURL">https://www.fakedomain.org/careersection/JB-10000/jobapply.ftl?lang=en&amp;job=106839</field>
            </record>
            <record>
                <field name="Client">Company X</field>
                <field name="TItle">Director, Sales--Army</field>
                <field name="ReqNumber">106051</field>
                <field name="JobBoardID">JB-13262</field>
                <field name="PostedDate">2019-03-04</field>
                <field name="City"/>
                <field name="StateProvince"/>
                <field name="Country">United States</field>
                <field name="Category">Sales Workers</field>
                <field name="JobText">Blah, blah, blah</field>
                <field name="ApplyURL">https://www.fakedomain.org/careersection/JB-13262/jobapply.ftl?lang=en&amp;job=106051</field>
            </record>
</ExportXML>

Подтверждение того, что это лучший подходобновив преобразование до XSLT 3.0

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0"
               xmlns:doc="http://www.taleo.com/ws/integration/toolkit/2005/07"
               xmlns="http://www.taleo.com/ws/integration/toolkit/2005/07"
               exclude-result-prefixes="doc"
               expand-text="yes">
   <xsl:mode on-no-match="shallow-copy"/>     

   <xsl:template match="doc:record">
      <xsl:copy> 
        <xsl:apply-templates select="@*|node()"/>
        <field name="ApplyURL">https://www.fakedomain.org/careersection/{
                doc:field[@name='JobBoardID']}/jobapply.ftl?lang=en&amp;job={
                doc:field[@name='ReqNumber']}</field>
      </xsl:copy>
   </xsl:template> 
</xsl:stylesheet>
0 голосов
/ 11 апреля 2019

Рассмотрим создание URL с concat для жестко закодированных и динамических данных.Обязательно назначьте префикс пространства имен для XSLT, например ниже, который использует doc , поскольку исходный входной XML поддерживает пространство имен по умолчанию:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
               xmlns:doc="http://www.taleo.com/ws/integration/toolkit/2005/07" > 
   <xsl:output 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> 

   <!-- rewrite record node -->
   <xsl:template match="doc:record">
      <xsl:copy> 
        <xsl:apply-templates select="doc:field"/>
        <xsl:variable name="url" select="concat('https://www.fakedomain.org/careersection/',
                                                doc:field[@name='JobBoardID'], '/',
                                                '/jobapply.ftl?lang=en&amp;job=',
                                                doc:field[@name='ReqNumber'])" />
        <xsl:element name="field" namespace="http://www.taleo.com/ws/integration/toolkit/2005/07">
            <xsl:attribute name="name">ApplyURL</xsl:attribute>
            <xsl:value-of select="$url"/>
        </xsl:element> 
      </xsl:copy>

   </xsl:template> 

</xsl:transform>

XSLT Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...