Как изменить XML с помощью XSL - PullRequest
0 голосов
/ 11 ноября 2018

Итак, у меня есть немного XML, и я хочу тот же XML, но с несколькими пропущенными строками. Вот мой оригинальный XML:

 <?xml version="1.0" encoding="UTF-8"?>
<Customers>
  <Customer>
    <FirstName>Sarah</FirstName>
    <LastName>Bellum</LastName>
    <PhoneNumbers>
      <PhoneNumber type="HOME">
        223 704 2215
      </PhoneNumber>
      <PhoneNumber type="WORK">
        223 704 1234
      </PhoneNumber>
      <PhoneNumber type="CELL">
        860 704 1234
      </PhoneNumber>
    </PhoneNumbers>
    <Addresses>
      <Address type="HOME">
        <Line1>123 Main</Line1>
        <Line2></Line2>
        <Line3></Line3>
        <City>Wallingford</City>
        <State>CT</State>
        <Zip>12345</Zip>
      </Address>
      <Address type="WOKR">
        <Line1>456 Main</Line1>
        <Line2></Line2>
        <Line3></Line3>
        <City>Willington</City>
        <State>CT</State>
        <Zip>12345</Zip>
      </Address>
    </Addresses>
  </Customer>

  <Customer>
    <FirstName>Mike</FirstName>
    <LastName>Easter</LastName>
    <PhoneNumbers>
      <PhoneNumber type="CELL">
        123 704 4321
      </PhoneNumber>
    </PhoneNumbers>
    <Addresses>
      <Address type="HOME">
        <Line1>14 East</Line1>
        <Line2></Line2>
        <Line3></Line3>
        <City>Shelton</City>
        <State>CT</State>
        <Zip>12345</Zip>
      </Address>
    </Addresses>
  </Customer>
</Customers>

и вот мой целевой XML:

 <Customers>
  <Customer>
    <Name>Sarah Bellum</Name>
    <!-- This element should only appear if the source element exists -->
    <HomePhone>223 704 2215</HomePhone>
    <!-- This element should only appear if the source element exists -->
    <WorkPhone>223 704 1234</WorkPhone>
    <!-- This element should only appear if the source element exists -->
    <CellPhone>860 704 1234</CellPhone>
    <!-- This element should only appear if the source element exists -->
    <HomeAddress>
      <Street>123 Main</Street>
      <City>Wallingford</City>
      <State>CT</State>
      <Zip>12345</Zip>
    </HomeAddress>
    <!-- This element should only appear if the source element exists -->
    <WorkAddress>
      <Street>456 Main</Street>
      <City>Willington</City>
      <State>CT</State>
      <Zip>12345</Zip>
    </WorkAddress>
  </Customer>

  <Customer>
    <Name>Mike Easter</Name>
    <CellPhone>123 704 4321</CellPhone>
    <HomeAddress>
      <Street>14 East</Street>
      <City>Shelton</City>
      <State>CT</State>
      <Zip>12345</Zip>
    </HomeAddress>
  </Customer>
</Customers>

У меня есть XSLT, но он просто копирует его, и я хочу, чтобы некоторые строки пропали. Вот мой XSLT:

 <?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="xml" indent="yes"/>

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

Итак, я дал вам целевой XML, оригинал и немного XSL. Я не знаю, как избавиться от линий, так что вы можете помочь.

1 Ответ

0 голосов
/ 11 ноября 2018

Ну, некоторые из правил преобразования здесь просты, например:

<xsl:template match="FirstName">
 <Name><xsl:value-of select="concat(., ' ', ../LastName)"/>
</xsl:template>

<xsl:template match="LastName"/>

или

<xsl:template match="Phone[@type='CELL']">
  <CellPhone><xsl:value-of select="."/></CellPhone>
</xsl:template>

Другие более сложны;Я не знаю, как вы решаете, какой строкой входного адреса является улица.

Но в принципе, какой у вас вопрос?С какой конкретно трудностью вы сталкиваетесь в этой трансформации?На первый взгляд, здесь нет ничего, что не было бы рассмотрено ни в одном учебнике «Начало XSLT».

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