Squeak.ru - шаблоны программирования

Переименовать повторяющиеся теги XML

У меня есть XML-документ xml с повторяющимися именами тегов, как показано ниже:

<ROOT>
    <RECORD>
        <ID>A1</ID>
        <NAME>Name1</NAME>
        <ADDRESS>StreetName</ADDRESS>
        <ADDRESS>CityName</ADDRESS>
        <ADDRESS>State</ADDRESS>
        <ADDRESS>321</ADDRESS>
        <PHONE>12345</PHONE>
    </RECORD>
    <RECORD>
        <ID>A1</ID>
        <NAME>Name1</NAME>
        <ADDRESS>StreetName</ADDRESS>
        <ADDRESS>CityName</ADDRESS>
        <ADDRESS>State</ADDRESS>
        <ADDRESS>123</ADDRESS>
        <PHONE>12345</PHONE>
    </RECORD>
</ROOT>

Поэтому мне нужно получить общий адрес, но когда я применяю XSLT, я получаю только значение первого тега. Есть ли возможность изменить имена тегов ADDRESS на соответствующие имена тегов, такие как теги STREET, CITY, STATE и ZIP.

17.04.2012

Ответы:


1

Это преобразование:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <my:reps>
  <rep pos="1">STREET</rep>
  <rep pos="1">CITY</rep>
  <rep pos="1">STATE</rep>
  <rep pos="1">ZIP</rep>
 </my:reps>

 <xsl:variable name="vReps"
      select="document('')/*/my:reps/*"/>

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

 <xsl:template match="ADDRESS">
  <xsl:variable name="vPos" select=
     "count(preceding-sibling::ADDRESS)+1"/>
  <xsl:element name="{$vReps[position()=$vPos]}">
    <xsl:apply-templates/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному XML-документу:

<ROOT>
    <RECORD>
        <ID>A1</ID>
        <NAME>Name1</NAME>
        <ADDRESS>StreetName</ADDRESS>
        <ADDRESS>CityName</ADDRESS>
        <ADDRESS>State</ADDRESS>
        <ADDRESS>321</ADDRESS>
        <PHONE>12345</PHONE>
    </RECORD>
    <RECORD>
        <ID>A1</ID>
        <NAME>Name1</NAME>
        <ADDRESS>StreetName</ADDRESS>
        <ADDRESS>CityName</ADDRESS>
        <ADDRESS>State</ADDRESS>
        <ADDRESS>123</ADDRESS>
        <PHONE>12345</PHONE>
    </RECORD>
</ROOT>

выдает желаемый правильный результат:

<ROOT>
   <RECORD>
      <ID>A1</ID>
      <NAME>Name1</NAME>
      <STREET>StreetName</STREET>
      <CITY>CityName</CITY>
      <STATE>State</STATE>
      <ZIP>321</ZIP>
      <PHONE>12345</PHONE>
   </RECORD>
   <RECORD>
      <ID>A1</ID>
      <NAME>Name1</NAME>
      <STREET>StreetName</STREET>
      <CITY>CityName</CITY>
      <STATE>State</STATE>
      <ZIP>123</ZIP>
      <PHONE>12345</PHONE>
   </RECORD>
</ROOT>

Пояснение:

Переопределение правила идентификации с помощью шаблона, соответствующего ADDRESS, и создание элемента в соответствии с позицией этого элемента ADDRESS.

17.04.2012

2

Да, вы можете изменить имя, если хотите, но это не даст вам ничего, чего у вас еще не было. Наличие названий улиц, городов и штатов ничем не отличается от получения узлов address[1], address[2], address[3].

17.04.2012
  • Но я не получаю адрес [1], адрес [2], адрес [3]. у меня есть с тем же адресом имени тега для всех этих. 17.04.2012
  • Да, вы делаете. Таким образом, когда вы выбираете их в XSLT, вы можете адресовать их следующим образом: ‹xsl:value-of select=address[1]/› ‹xsl:value-of select=address[2]/›. Число в скобках — это местонахождение тега, поэтому адрес [1] — это первый адрес, адрес [2] — второй адрес и т. д. Если у вас есть проблемы с этим, вам нужно найти ось xpath. 17.04.2012
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...