Пространство имен как переменная для документа, обрабатываемого с помощью XSLT - PullRequest
0 голосов
/ 14 мая 2019

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

Файлы названы;Supplier_Invoices_1, Supplier_Invoices_2, Supplier_Invoices_3 и т. Д. Без расширения, но они представляют собой XML.

Пространство имен для для Supplier_Invoices_2:

xmlns:wd="urn:com.cust.report/Supplier_Invoices_2"

Для Invoice_1:

"urn:com.cust.report/Supplier_Invoices_1" 

Invoice_3

1012 * и др.1022 *
<?xml version="1.0" encoding="UTF-8"?>
<message xmlns:wd="urn:com.cust.report/Supplier_Invoices_2">
   <data>
      <Documents>
         <row>
            <path>Supplier_Invoices_2</path>
            <CardCode>S-00000461</CardCode>
         </row>
      </Documents>
      <Document_Lines>
         <row>
            <Price>1956.92</Price>
         </row>
      </Document_Lines>
   </data>
</message>

Мой вопрос, как я могу установить пространство имен в моем документе XSL в качестве переменной для документа, который он обрабатывает?

Я добавил xsl: param в свой XSL.Верхние 5 строчек документа выглядят так:

<xsl:stylesheet version="2.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:wd="urn:com.cust.report/$npath" >
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">        
     <xsl:param name="XSLPath" select="base-uri()"/>
     <xsl:param name="npath" select="tokenize($XSLPath,'/')[last()]" />

Вывод:

<?xml version="1.0" encoding="UTF-8"?>
<message xmlns:wd="urn:com.cust.report/$npath">
   <data/>
</message>

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 14 мая 2019

В XSLT / XPath 2 и более поздних версиях вы можете использовать подстановочный знак пространства имен *:foo для выбора элементов с локальным именем foo в любом пространстве имен, так что если вы используете, например, например, *:Report_Data вместо wd:Report_Data вы сможете обрабатывать документы той же структуры, но с разными пространствами имен.

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

...