2013-11-13 2 views
1

Позвольте мне начать с того, что я понятия не имею, что я делаю с XSLT. Все XSLT, которые у меня есть, унаследованы от других людей. У меня есть некоторый XML (это EAD, если это помогает), который не сформирован так, как ожидаются его таблицы стилей, и поэтому он не будет надлежащим образом преобразован в XHTML.XSLT для перемещения XML-брата к ребенку

В принципе, мне нужно для <unitdate> быть ребенком <unittitle>, а не его родным братом.

Большая часть документа выглядит следующим образом:

<c03 id="ref13" level="file"> 
<did> 
<unittitle>1. President (White House)</unittitle> 
<container id="cid192710" type="Box" label="Text">1</container> 
<container parent="cid192710" type="Folder">2</container> 
<unitdate normal="1953/1956" type="inclusive">1953-1956</unitdate> 
</did> 
</c03> 

И мне нужно, чтобы выглядеть следующим образом:

<c03 id="ref13" level="file"> 
<did> 
<unittitle>1. President (White House)<unitdate normal="1953/1956" type="inclusive">1953-1956</unitdate></unittitle> 
<container id="cid192710" type="Box" label="Text">1</container> 
<container parent="cid192710" type="Folder">2</container> 
</did> 
</c03> 

Есть простой способ сделать это? Я знаю, что есть похожие вопросы, но я не понимаю этого достаточно, чтобы адаптировать их, чтобы они работали правильно. Благодарю.

+1

wihtout xslt обрабатывает этот xml, мы не можем многое сделать. Вероятно, это будет относительная простая задача (если в первую очередь xslt пригодится) –

+0

Вместо того, чтобы возиться с XSLT, который меняет это на XHTML, я надеялся просто изменить сам XML, так что XSLT, который у меня уже есть, будет работать должным образом , Разве это невозможно? – user2988363

+0

Наверняка есть; используйте другой XSLT для запуска перед существующими XSLT. –

ответ

0

Чтобы не изменять существующие XSLT и все еще иметь возможность обрабатывать XML-указатель, вы можете использовать следующий сегмент XSLT (1.0) для решения вашей проблемы.

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:template match="*"> 
     <xsl:copy> 
    <xsl:apply-templates /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="did"> 
     <xsl:copy> 
     <xsl:apply-templates select="*[local-name()!='unitdate']"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="unittitle"> 
     <xsl:element name="unittitle"> 
      <xsl:value-of select="text()"/> 
      <xsl:copy-of select="../unitdate" /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="@*|text()|comment()|processing-instruction"> 
    <xsl:copy-of select="."/> 
    </xsl:template> 

</xsl:stylesheet> 

Но вы должны серьезно подумать об использовании этого. Модификация существующих XSLT - разумная вещь. Это приводит к увеличению производительности.

+0

Я определенно понимаю, почему это не лучший подход, но поскольку это было всего лишь одноразовое исправление, «легкий» способ был высоко оценен. Он отлично справился и сдержал меня. Большое спасибо! – user2988363

1

Попробуйте эти шаблоны:

<xsl:template match="unittitle[following-sibling::unitdate]"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    <xsl:copy-of select="following-sibling::unitdate"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="unitdate"/> 

и шаблон идентичности:

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

Идентичность копирует шаблон все в точности как есть. Два предыдущих шаблона переопределяют его в конкретных случаях, когда у вас есть элемент unittitle с последующим братом unitdate и элементом unitdate.

Вы, вероятно, заметили, что первый шаблон практически идентичен идентичности template- это потому, что он копирует unittitle же образом идентичность один делает, кроме него также копирует следующие unitdate элемента, а также, после обработки всего остального (т.е. текст).

Шаблон одной строки unitdate просто удаляет его из того места, где он был, обрабатывая его, и ничего не выводит.

Смежные вопросы