Преобразование XML в XML с помощью XSLT - PullRequest
1 голос
/ 27 марта 2012

Я очень плохо знаком с XSLT (в течение ~ 1 часа) и, к сожалению, на данный момент у меня нет слишком много времени, чтобы изучить его (у меня есть веха), поэтому я хотел бы знать, есть ли кто-то, кто может помогите мне определить XSLT для преобразования такого файла:

<?xml version="1.0" encoding="UTF-8"?>
<epics-doi xmlns:dc="http://dublincore.org/documents/dcmi-namespace/">
  <record>
    26.03.2012PK_000404500
    <dc:identifier>a</dc:identifier>
    313
    <dc:identifier>1</dc:identifier>
  </record>
  <record>
    26.03.2012PK_000404500
    <dc:identifier>b</dc:identifier>
    313
    <dc:identifier>2</dc:identifier>
  </record>
  ...
</epics-doi>

В это:

<?xml version="1.0" encoding="UTF-8" ?>
<OAI-PMH>
    <responseDate></responseDate>
    <request></request>
    <ListRecords>
        <record>
            <header>
                <identifier></identifier>
                <datestamp></datestamp>
                <setSpec></setSpec>
            </header>
            <metadata>
                <oai_dc:dc>
                    <dc:type></dc:type>
                    <dc:language></dc:language>
                    <dc:identifier>a</dc:identifier>
                    <dc:title></dc:title>
                    <dc:publisher></dc:publisher>
                    <dc:publisher></dc:publisher>
                    <dc:date></dc:date>
                    <dc:format></dc:format>
                    <dc:creator></dc:creator>
                    <dc:contributor></dc:contributor>
                    <dc:identifier>1</dc:identifier>
                </oai_dc:dc>
            </metadata>
        </record>
        <record>
            <header>
                <identifier></identifier>
                <datestamp></datestamp>
                <setSpec></setSpec>
            </header>
            <metadata>
                <oai_dc:dc>
                    <dc:type></dc:type>
                    <dc:language></dc:language>
                    <dc:identifier>b</dc:identifier>
                    <dc:title></dc:title>
                    <dc:publisher></dc:publisher>
                    <dc:publisher></dc:publisher>
                    <dc:date></dc:date>
                    <dc:format></dc:format>
                    <dc:creator></dc:creator>
                    <dc:contributor></dc:contributor>
                    <dc:identifier>2</dc:identifier>
                </oai_dc:dc>
            </metadata>
        </record>
        ...
    </ListRecords>
</OAI-PMH>

Я попробовал это (оставив некоторые теги):

<?xml version="1.0" encoding="UTF-8"?>
<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="/">
      <xsl:apply-templates select="/epics-doi/record/metadata" />
   </xsl:template>
   <xsl:template match="metadata">
      <oai_dc:dc xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/dc/terms/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/                     http://www.openarchives.org/OAI/2.0/oai_dc.xsd">
         <xsl:for-each select="dc:identifier">
            <dc:identifier>
               <xsl:value-of select="dc:identifier" />
            </dc:identifier>
         </xsl:for-each>
      </oai_dc:dc>
   </xsl:template>
</xsl:stylesheet>

но я не знаю, нахожусь ли я на правильном пути, как будто я загружаю файл в Firefox, страница остается пустой ...

Большое спасибо заранее!


Спасибо, Кеван. Ваш XSLT прав, но у него есть одна проблема: если у меня есть более одной записи (как в примере выше), я получаю две записи и в результирующем XML, но в каждой записи есть 4 dc: identifier; каждый идентификатор добавляется в каждую запись ...:

<?xml version="1.0" encoding="utf-8"?>
<OAI-PMH xmlns:dc="http://dublincore.org/documents/dcmi-namespace/"
    xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/">
    <responseDate/>
    <request/>
    <ListRecords>
        <record>
            <header>
                <identifier/>
                <datestamp/>
                <setSpec/>
            </header>
            <metadata>
                <oai_dc:dc>
                    <dc:type/>
                    <dc:language/>
                    <dc:title/>
                    <dc:publisher/>
                    <dc:publisher/>
                    <dc:date/>
                    <dc:format/>
                    <dc:creator/>
                    <dc:contributor/>
                    <dc:identifier>a</dc:identifier>
                    <dc:identifier>1</dc:identifier>
                    <dc:identifier>b</dc:identifier>
                    <dc:identifier>2</dc:identifier>
                </oai_dc:dc>
            </metadata>
        </record>
        <record>
            <header>
                <identifier/>
                <datestamp/>
                <setSpec/>
            </header>
            <metadata>
                <oai_dc:dc>
                    <dc:type/>
                    <dc:language/>
                    <dc:title/>
                    <dc:publisher/>
                    <dc:publisher/>
                    <dc:date/>
                    <dc:format/>
                    <dc:creator/>
                    <dc:contributor/>
                    <dc:identifier>a</dc:identifier>
                    <dc:identifier>1</dc:identifier>
                    <dc:identifier>b</dc:identifier>
                    <dc:identifier>2</dc:identifier>
                </oai_dc:dc>
            </metadata>
        </record>
    </ListRecords>
</OAI-PMH>

Ответы [ 3 ]

3 голосов
/ 28 марта 2012

Попробуйте:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:dc="http://dublincore.org/documents/dcmi-namespace/"
    xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/">
    <xsl:output method="xml"/>

   <xsl:template match="/">
       <OAI-PMH>
           <responseDate></responseDate>
           <request></request>
           <ListRecords>
               <xsl:apply-templates select="/epics-doi/record"/>
           </ListRecords>
       </OAI-PMH>
   </xsl:template>

    <xsl:template match="/epics-doi/record">
        <record>
            <header>
                <identifier></identifier>
                <datestamp></datestamp>
                <setSpec></setSpec>
            </header>
            <metadata>
                <oai_dc:dc>
                    <dc:type></dc:type>
                    <dc:language></dc:language>
                    <dc:title></dc:title>
                    <dc:publisher></dc:publisher>
                    <dc:publisher></dc:publisher>
                    <dc:date></dc:date>
                    <dc:format></dc:format>
                    <dc:creator></dc:creator>
                    <dc:contributor></dc:contributor>
                    <xsl:apply-templates select="/epics-doi/record/dc:identifier"/>
                </oai_dc:dc>
            </metadata>
        </record>
    </xsl:template>

    <xsl:template match="/epics-doi/record/dc:identifier">
        <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>

Одна проблема, которую я заметил, состоит в том, что пространство имен постоянного тока в XML - это "http://dublincore.org/documents/dcmi-namespace/, но в XSL" http://purl.org/dc/elements/1.1/" - я не думаю, что это можетработа

2 голосов
/ 27 марта 2012
<xsl:apply-templates select="/epics-doi/record/metadata"/>

Ваш /epics-doi/record узел не содержит ни одного узла metadata, поэтому он не будет ничего совпадать.

Вы должны использовать

<xsl:apply-templates select="/epics-doi/record"/>

вместе с

<xsl:template match="record">
   <!-- Transformation here -->
</xsl:template>

Подсказка: Вы можете использовать такой инструмент, как oXygen, для разработки XSLT (извините, я никогда не использовал его, поэтому не знаю открытого)

UPDATE:

Кроме того, вам не нужно использовать dc: в выборе foreach, плюс внутри цикла вы уже выбрали узел. Я думаю, это должно выглядеть больше как:

<xsl:for-each select="identifier">
    <dc:identifier>
        <xsl:value-of select="."/>
    </dc:identifier>
</xsl:for-each>
0 голосов
/ 28 марта 2012

Я изменил ваш ответ таким образом, и теперь он работает ...

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:dc="http://dublincore.org/documents/dcmi-namespace/"
    xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/">
    <xsl:output method="xml"/>

    <xsl:template match="/">
        <OAI-PMH>
            <ListRecords>
                <xsl:apply-templates select="epics-doi/record"/>
            </ListRecords>
        </OAI-PMH>
    </xsl:template>

    <xsl:template match="record">
        <record>
            <header>
            </header>
            <metadata>
                <oai_dc:dc>
                    <xsl:apply-templates select="dc:identifier"/>
                </oai_dc:dc>
            </metadata>
        </record>
    </xsl:template>

    <xsl:template match="dc:identifier">
        <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>

Еще раз спасибо.

...