Arhn - архитектура программирования

Удалите символ ', # из узла All XML с помощью XSLT без создания нового шаблона

Я хочу удалить '(одинарные кавычки) и # из файла XML. Мне нужно проверить все узлы XML. У меня уже есть шаблон XSLT, который выполняет другое извлечение данных. Поэтому я не могу создать другой шаблон в том же XSLT. Также я не хочу вызывать функцию перевода во всех узлах. Есть ли простой способ применить функцию перевода ко всем узлам? и могу ли я применить 2 шаблона в том же XSLT, где первый шаблон будет извлекаться, а второй шаблон будет переводить данные?

Кто-нибудь может мне помочь? Образец XML:

 <Report>
    <ResCountryCode>US</ResCountryCode>
    <Reporting>
        <TIN>
          <TaxIDNo>12456-451</TaxIDNo>
          <TINCountryCode>US</TINCountryCode>
        </TIN>
        <TIN>
          <TaxIDNo>4454-8754-4</TaxIDNo>
          <TINCountryCode>US</TINCountryCode>
        </TIN>
        <OrganizationName>AB'C Ca'r Limi#ted</OrganizationName>
        ....
        ....(other nodes with same ' and # character)
    </Reporting>

</Report>

Пример XSLT:

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

<xsl:template match="Report">  
    <Finance>
        <Reporting>
            <xsl:element name="ResCode">
                <xsl:value-of select="ResCountryCode" />
              </xsl:element>
              <xsl:for-each select="Reporting/TIN">
                <xsl:element name="TIN">
                  <xsl:attribute name="issuedBy">
                    <xsl:value-of select="TINCountryCode" />
                  </xsl:attribute>
                  <xsl:value-of select="TaxIDNo" />
                </xsl:element>
              </xsl:for-each>
              <xsl:element name="Name">
                <xsl:value-of select="Reporting/OrganizationName" />
              </xsl:element>
        </Reporting>
     </Finance>
 </xsl:template>

Выход:

<Report>
     <Finance>
        <ResCountryCode>US</ResCountryCode>
        <Reporting>
            <sfa:TIN issuedBy="US">12456-451</sfa:TIN>
            <sfa:TIN issuedBy="US">4454-8754-4</sfa:TIN>
            <Name>AB'C Ca'r Limi#ted</Name>
            ....
            ....
        </Reporting>
     </Finance>
 </Report>

Ожидаемый выход:

 <Report>
     <Finance>
        <ResCountryCode>US</ResCountryCode>
        <Reporting>
            <sfa:TIN issuedBy="US">12456-451</sfa:TIN>
            <sfa:TIN issuedBy="US">4454-8754-4</sfa:TIN>
            <Name>ABC Car Limited</Name>
            ....
            ....(with out ' and #)
        </Reporting>
     </Finance>
 </Report>
01.07.2016

Ответы:


1

Вместо использования xsl:value-of для получения значения узла используйте xsl:apply-templates следующим образом:

<xsl:apply-templates select="Reporting/OrganizationName/text()" />

Затем создайте шаблон, соответствующий text(), чтобы выполнить перевод в одном месте.

Приоритетом является обеспечение соответствия перед шаблоном удостоверения.

Попробуйте этот XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />

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

  <xsl:template match="text()" priority="2">
    <xsl:value-of select='translate(., "#&apos;", "")' />
  </xsl:template>

   <xsl:template match="Report">  
    <Finance>
        <Reporting>
            <xsl:element name="ResCode">
                <xsl:apply-templates select="ResCountryCode/text()" />
              </xsl:element>
              <xsl:for-each select="Reporting/TIN">
                <xsl:element name="TIN">
                  <xsl:attribute name="issuedBy">
                      <xsl:apply-templates select="TINCountryCode/text()" />
                  </xsl:attribute>
                  <xsl:value-of select="TaxIDNo" />
                </xsl:element>
              </xsl:for-each>
              <xsl:element name="Name">
                  <xsl:apply-templates select="Reporting/OrganizationName/text()" />
              </xsl:element>
        </Reporting>
     </Finance>
 </xsl:template>
</xsl:stylesheet>
01.07.2016
  • Привет, Тим, большое спасибо. Работает отлично. 01.07.2016

  • 2

    Лучший способ сделать это в XSLT - это конвейер преобразований. Не пытайтесь выполнить несколько преобразований за один проход над входом; создать конвейер преобразований, каждое из которых выполняет одну простую работу. В итоге вы получите код, который намного проще и легче отлаживать, и его гораздо легче использовать повторно, потому что каждый шаг конвейера можно повторно использовать в других конвейерах. (Если это звучит знакомо, да, это фундаментальная концепция программирования оболочки UNIX).

    01.07.2016
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..