XSL-код для переименования префикса без нарушения атрибутов - PullRequest
0 голосов
/ 15 марта 2020

Я привел ниже коды XSL, которые я пробовал, и часть входных и выходных кодов. Если я использую XSL1 для переименования значений префикса пространства имен в тегах xml, к сожалению, он сворачивает значения атрибута, и если я использую XSL2 Атрибуты создаются отдельными узлами. Может кто-нибудь, пожалуйста, помогите написать XSL для переименования префиксов, но сохранить атрибуты в том же узле.

XSL 1:

<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ns0:*">
<xsl:element name="ubl:{local-name()}" namespace="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>

XSL2:

<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy></xsl:template>
 <xsl:template match="@*">
 <xsl:element name="{name()}">
 <xsl:value-of select="."/>
 </xsl:element>
 </xsl:template>
<xsl:template match="ns0:*">
<xsl:element name="ubl:{local-name()}" namespace="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>

Входные данные:

<ns5:LegalMonetaryTotal>
  <ns2:LineExtensionAmount currencyID="EUR">35.38</ns2:LineExtensionAmount>
  <ns2:TaxExclusiveAmount currencyID="EUR">35.38</ns2:TaxExclusiveAmount>
  <ns2:TaxInclusiveAmount currencyID="EUR">37.5</ns2:TaxInclusiveAmount>
  <ns2:PrepaidAmount currencyID="EUR">37.5</ns2:PrepaidAmount>
  <ns2:PayableAmount currencyID="EUR">0.00</ns2:PayableAmount>
</ns5:LegalMonetaryTotal>

Выходные данные:

<cac:LegalMonetaryTotal >
  <cbc:LineExtensionAmount >EUR35.38</cbc:LineExtensionAmount>
  <cbc:TaxExclusiveAmount >EUR35.38</cbc:TaxExclusiveAmount>
  <cbc:TaxInclusiveAmount >EUR37.5</cbc:TaxInclusiveAmount>
  <cbc:PrepaidAmount >EUR37.5</cbc:PrepaidAmount>
  <cbc:PayableAmount >EUR0.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>

Выходные данные:

<cac:LegalMonetaryTotal >
  <cbc:LineExtensionAmount >
    <currencyID>EUR</currencyID>
    35.38
  </cbc:LineExtensionAmount>
  <cbc:TaxExclusiveAmount >
    <currencyID>EUR</currencyID>
    35.38
  </cbc:TaxExclusiveAmount>
  <cbc:TaxInclusiveAmount >
    <currencyID>EUR</currencyID>
    37.5
  </cbc:TaxInclusiveAmount>
  <cbc:PrepaidAmount >
    <currencyID>EUR</currencyID>
    37.5
  </cbc:PrepaidAmount>
  <cbc:PayableAmount>
    <currencyID>EUR</currencyID>
    0.00
  </cbc:PayableAmount>
</cac:LegalMonetaryTotal>

Но ожидаемый результат: я перепробовал несколько вариантов, ребята. Пожалуйста, помогите мне получить следующий формат.

<cbc:LegalMonetaryTotal>
  <cac:LineExtensionAmount currencyID="EUR">35.38</cac:LineExtensionAmount>
  <cac:TaxExclusiveAmount currencyID="EUR">35.38</cac:TaxExclusiveAmount>
  <cac:TaxInclusiveAmount currencyID="EUR">37.5</cac:TaxInclusiveAmount>
  <cac:PrepaidAmount currencyID="EUR">37.5</cac:PrepaidAmount>
  <cac:PayableAmount currencyID="EUR">0.00</cac:PayableAmount>
</cbc:LegalMonetaryTotal>

С уважением,

Indu

1 Ответ

0 голосов
/ 16 марта 2020

Причина, по которой ваша первая таблица стилей не выводит никаких атрибутов, заключается в том, что у вас нет шаблона, который обрабатывает атрибуты. Поэтому инструкция:

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

ничего не делает для атрибутов.

Попробуйте изменить свой первый шаблон:

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

на стандартный преобразование личности шаблон:

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

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

<xsl:template match="ns0:*">

, но ваш ввод не содержит элементов с префиксом ns0. И ваша таблица стилей выводит префикс ubl, в то время как ожидаемый вывод использует префиксы cbc и cac. И - как уже упоминалось в комментариях к вашему вопросу - все эти префиксы должны быть привязаны к пространствам имен, чтобы входные данные и входные данные были правильно сформированы XML документов.

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