Преобразование XML в XML с использованием файла XSLT - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь преобразовать XML из одного формата в другой, но мне не очень повезло в поиске ресурсов, объясняющих, как это работает слишком хорошо.Как я могу установить данные внутри тегов XML, используя значение, которое находится внутри других тегов XML?

Вот начальный XML

<?xml version="1.0" encoding="utf-8"?>
<In xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="in.xsd">
  <Submit ID="1234">
    <Label>
      <Code>300</Code>
      <Source>27</Source>
    </Label>
    <Data>
      <Number>18</Number>
      <Date>2018-04-01</Date>
      <IsFile>0</IsFile>
      <Location></Location>
      <Files>
        <File>
          <Name>red.pdf</Name>
          <Classification>FILE</Classification>
        </File>
        <File>
          <Name>picture.pdf</Name>
          <Type>IMAGE</Type>
        </File>
      </Files>
    </Data>
  </Submit>
</In>

Мой текущий 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="/">
    <xsl:apply-templates select="In"/>
  </xsl:template>
  <xsl:template match="In">
    <Q xmlns:tns="Q" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Source="{@source}" Notification="true">
      <xsl:value-of select="Submit/Label/Source"/>
    </Q>
  </xsl:template>
</xsl:stylesheet>

Ожидаемый конечный результат после использования XSLT для преобразования XML-файла.

<?xml version="1.0" encoding="utf-8"?>
<Q xmlns:tns="Q" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="scheme.xsd" Source="27" Notification="true">
<SubmitID="1234">
<Label>
    <Code>300</Code>
    <Source>27</Source>
</Label>
<Data>
    <Number>18</Number>
    <Date>2018-04-01</Date>
    <IsFile>0</IsFile>
</Data>
<Files>
    <File>
        <Name>red.pdf</Name>
        <Type>FILE</Type>
    </File>
    <File>
        <Name>picture.pdf</Name>
        <Type>IMAGE</Type>
    </File>
</Files>
</Submit>
</Q>

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

Ответы [ 2 ]

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

Попробуйте следующую таблицу стилей XSLT-1.0:

<?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"/>

  <!-- identity template - copies all elements and its children and attributes -->    
  <xsl:template match="node()|@*">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*" />
      </xsl:copy>
  </xsl:template>    

  <xsl:template match="/In">                   <!-- Remove the 'In' element -->
    <xsl:apply-templates select="node()"/>
  </xsl:template>

  <xsl:template match="Submit">                <!-- Create the 'Q' element and its sub-elements -->
    <Q xmlns:tns="Q" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Source="{@source}" Notification="true">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates select="Label" />
            <xsl:apply-templates select="Data" />
            <xsl:apply-templates select="Data/Files" />
        </xsl:copy>
    </Q>
  </xsl:template>

  <xsl:template match="Data">                  <!-- Create the 'Data' sub-element without all of its children -->
    <xsl:copy>
        <xsl:copy-of select="Number"/>
        <xsl:copy-of select="Date"/>
        <xsl:copy-of select="IsFile"/>
    </xsl:copy>
  </xsl:template>  

</xsl:stylesheet>
0 голосов
/ 08 ноября 2018

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

<?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="/">
    <xsl:apply-templates select="In"/>
  </xsl:template>

  <xsl:template match="In">
    <Q xmlns:tns="Q" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Source="{Submit/Label/Source}" Notification="true">
      <xsl:value-of select="Submit/Label/Source"/>
      <Label>
      <Code><xsl:value-of select="Submit/Label/Code"/></Code>
      <Source><xsl:value-of select="Submit/Label/Source"/></Source>
      </Label>
    </Q>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...