Фильтрация большей части XML с помощью XSL? - PullRequest
0 голосов
/ 10 апреля 2009

Мне нужно преобразовать много файлов XML (экспорт Fedora) в другой тип XML. Попытка сделать это с помощью таблиц стилей XSL и проверка с помощью преобразователя msxsl.

Возможно, у меня есть XML-файл, подобный этому (при условии, что на самом деле есть другие узлы внутри AAA, OBJ и всех остальных узлов), Source.XML:

<DOC>
<AAA>
    <STUFF>example</STUFF>
    <OBJ>
        <OBJVERS id="A1" CREATED="2008-02-18T13:28:08.245Z"/>
        <OBJVERS id="A2" CREATED="2008-02-19T10:42:41.965Z"/>
        <OBJVERS id="A13" CREATED="2009-03-16T12:43:11.703Z"/>
    </OBJ>
</AAA>
<FFF/>
<GGG/>
<DDD>
    <FILE />
</DDD>
</DOC>

Какой мне нужно выглядеть примерно так (Target.XML):

    <MYOBJ>
      <ELEM>contents of OBJVERS with the biggest id OR 
creation date (whichever is easier to do) go here</ELEM>
      <IMAGE> contents of <FILE> node go here</IMAGE>
    </MYOBJ>

Основная проблема, с которой я столкнулся, заключается в том, что, поскольку я новичок в XSL (и для выполнения этой конкретной задачи у меня недостаточно времени, чтобы изучить его должным образом), я не могу понять, как заставить процессор XSL ничего не обрабатывать Я продолжаю получать выходные данные, например.

Обновление: в принципе, я решил эту проблему. Я выложу свой ответ и закрою вопрос.

Update2: ОК, ответ Эндрю тоже работает, так что я просто принимаю его. :)

Ответы [ 2 ]

2 голосов
/ 10 апреля 2009

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

При этом, приведенное ниже преобразование :

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

    <xsl:template match="/">
      <MYOBJ>
        <ELEM>
           <xsl:for-each select="/*/AAA/OBJ/OBJVERS">
             <xsl:sort select="@CREATED" order="descending"/>

             <xsl:if test="position() = 1">
                <xsl:copy-of select="."/>
             </xsl:if>
           </xsl:for-each>
        </ELEM>

        <IMAGE>
          <xsl:copy-of select="/*/DDD/FILE"/>
        </IMAGE>
      </MYOBJ>
    </xsl:template>
</xsl:stylesheet>

при применении к искусственному и надуманному предоставленному XML-документу (который фактически имеет плохую структуру и наименование и противоречит многим принципам проектирования XML-документов):

<DOC>
    <AAA>
        <STUFF>example</STUFF>
        <OBJ>
            <OBJVERS id="A1" CREATED="2008-02-18T13:28:08.245Z"/>
            <OBJVERS id="A2" CREATED="2008-02-19T10:42:41.965Z"/>
            <OBJVERS id="A13" CREATED="2009-03-16T12:43:11.703Z"/>
        </OBJ>
    </AAA>
    <FFF/>
    <GGG/>
    <DDD>
        <FILE />
    </DDD>
</DOC>

дает то, что, как можно догадаться, является желаемым результатом :

<MYOBJ>
   <ELEM>
      <OBJVERS id="A13" CREATED="2009-03-16T12:43:11.703Z"/>
   </ELEM>
   <IMAGE>
      <FILE/>
   </IMAGE>
</MYOBJ>
0 голосов
/ 10 апреля 2009

Это не полное решение, поскольку оно не сортирует ОБЪЕВОРЫ перед выбором первого. Но если вам удастся решить проблему выбора правильных OBJVERS, то я думаю, что это сделает все остальное.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml"/>
<xsl:template match="/">
    <MYOBJ>
        <xsl:for-each select="/DOC/AAA/OBJ/OBJVERS[position()==1]">
            <ELEM><xsl:copy-of select="*"/></ELEM>
        </xsl:for-each>
        <IMAGE><xsl:copy-of select="/DOC/DDD/FILE/*" /></IMAGE>
    </MYOBJ>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...