xslt вложенный выбор из значения узла xml

Я уже просмотрел некоторые другие сообщения о вложенных выборках и не верю, что они относятся к моему варианту использования. По сути, я пытаюсь создать учетную запись пользователя в другой системе через веб-службу, и мне нужно передать идентификатор входа, который происходит из поля в моем xml, которое может быть практически любым, например идентификатор сотрудника, адрес электронной почты, UUID и т. д. Поле для использования будет исходить из значения конфигурации, которое входит в генерацию xml. Я сократил свои xml и xslt для простоты, поэтому, пожалуйста, не предлагайте мне использовать оператор выбора или если, так как мне нужно держать возможные поля xml для выбора широко открытыми.

Пример XML:

<root>
  <General>
    <Name Prefix="MR" First="Mickey" Middle="M" Last="Mouse" Suffix="I" Title="BA" Gender="M" BirthMonth="02" BirthDay="26" BirthYear="1984"/>
    <Email Work="[email protected]" Home="[email protected]"/>
    <EmployeeId>9948228</EmployeeId>
  </General>
  <ConfigProperties>
    <LoginID>root/General/EmployeeId</LoginID>
  </ConfigProperties>
</root>

Пример XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes" />
<xsl:template match="/">
  <Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:variable name="xxLI" select="root/ConfigProperties/LoginID" />
    <xsl:attribute name="LoginId"><xsl:value-of select="$xxLI"/></xsl:attribute>
  </Response>
</xsl:template>
</xsl:stylesheet>

Преобразованный XML:

<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          LoginId="root/General/EmployeeId"/>

Я действительно надеюсь получить что-то вроде:

<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          LoginId="9948228"/>

Я в тупике. Какие-нибудь мысли?


person David W.    schedule 05.07.2018    source источник
comment
Вы ограничены XSLT 1?   -  person Jim Garrison    schedule 05.07.2018
comment
К сожалению, да, поскольку мне приходится идти по старой школе и использовать libxml/libxslt с c.   -  person David W.    schedule 05.07.2018


Ответы (2)


В обычном XSLT 1 это сделать невозможно, но если ваш XSLT-процессор поддерживает «динамическое» расширение (его поддерживает XALAN), вы можете сделать это:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:dyn="http://exslt.org/dynamic"
    extension-element-prefixes="dyn">

    <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes" />
    <xsl:template match="/">
        <Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <xsl:variable name="xxLI" select="root/ConfigProperties/LoginID" />
            <xsl:attribute name="LoginId"><xsl:value-of select="dyn:evaluate($xxLI)"/></xsl:attribute>
        </Response>
    </xsl:template>
</xsl:stylesheet>

Я протестировал это в Oxygen/XML с использованием XALAN и получил такой результат

<?xml version="1.0" encoding="utf-8"?>
<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" LoginId="9948228"/>
person Jim Garrison    schedule 05.07.2018

Спасибо - сработало как шарм, потратив пару часов на правильную реализацию в libxslt. Для всех, кто использует c, кто заинтересован, объявите следующее:

#include <libexslt/exslt.h>
#include <libexslt/exsltconfig.h>

а затем включите в свой код следующую строку:

exsltRegisterAll();

и обязательно ссылайтесь на библиотеку при компиляции

-lexslt
person David W.    schedule 05.07.2018