2010-07-09 2 views
3

Я пытаюсь написать преобразование XSLT, которое заменит значение в одном узле значением его предшествующего брата. Затем верните весь документ преобразованный :)XSLT - заменить значение в одном узле значением из его предшествующего брата.

Найти вхождение

<package:packageDownloadLocator>http://myunwantedurl</package:packageDownloadLocator> 

и заменить с текстом значением это исходя двойники

<package:packagePreviewLocator>http://myurl.com</package:packagePreviewLocator> 

Спасибо за любую помощь или предложения

Примечание. Найденный узел не всегда существует в каждой записи.

Отсюда:

<?xml version="1.0"?> 
<SRW:searchRetrieveResponse xmlns:SRW="http://www.loc.gov/zing/srw/" xmlns:DIAG="http://www.loc.gov/zing/srw/diagnostics" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:package="info:srw/extension/13/package-v1.0"> 
<SRW:records> 
<SRW:record> 
    <SRW:recordData> 
    <dc:dc> 
    <dc:title xml:lang="en">Opportunities for involvement for service users and carers at the Open University in Scotland</dc:title> 
    <dc:description xml:lang="en">Booklet explaining the different ways service users or carers can assist</dc:description> 
    <dc:publisher>Open University</dc:publisher> 
    <dc:format>application/pdf</dc:format> 
    <dc:type>Narrative Text</dc:type> 
    <dc:rights xml:lang="en">Copyright Open University, 2009</dc:rights> 
    <dc:subject>health and health care, health care, nursing</dc:subject> 
    </dc:dc> 
    </SRW:recordData> 
    <SRW:extraRecordData> 
    <package:packagePreviewLocator>http://myurl.com</package:packagePreviewLocator> 
    <package:packageDownloadLocator>http://myunwantedurl</package:packageDownloadLocator> 
    <record:record xmlns:record="http://srw.o-r-g.org/schemas/rec/1.0/"> 
    <record:lastModified>2009-09-29</record:lastModified> 
    <record:created>2009-09-29</record:created> 
    </record:record> 
    </SRW:extraRecordData> 
    </SRW:record> 
</SRW:records> 
</SRW:searchRetrieveResponse> 

Для этого:

<?xml version="1.0"?> 
<SRW:searchRetrieveResponse xmlns:SRW="http://www.loc.gov/zing/srw/" xmlns:DIAG="http://www.loc.gov/zing/srw/diagnostics" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:package="info:srw/extension/13/package-v1.0"> 
<SRW:records> 
<SRW:record> 
    <SRW:recordData> 
    <dc:dc> 
    <dc:title xml:lang="en">Opportunities for involvement for service users and carers at the Open University in Scotland</dc:title> 
    <dc:description xml:lang="en">Booklet explaining the different ways service users or carers can assist</dc:description> 
    <dc:publisher>Open University</dc:publisher> 
    <dc:format>application/pdf</dc:format> 
    <dc:type>Narrative Text</dc:type> 
    <dc:rights xml:lang="en">Copyright Open University, 2009</dc:rights> 
    <dc:subject>health and health care, health care, nursing</dc:subject> 
    </dc:dc> 
    </SRW:recordData> 
    <SRW:extraRecordData> 
    <package:packagePreviewLocator>http://myurl.com</package:packagePreviewLocator> 
    <package:packageDownloadLocator>http://myurl.com</package:packageDownloadLocator> 
    <record:record xmlns:record="http://srw.o-r-g.org/schemas/rec/1.0/"> 
    <record:lastModified>2009-09-29</record:lastModified> 
    <record:created>2009-09-29</record:created> 
    </record:record> 
    </SRW:extraRecordData> 
    </SRW:record> 
</SRW:records> 
</SRW:searchRetrieveResponse> 
+0

Хороший вопрос (+1). См. Мой ответ для полного решения, которое использует один из самых фундаментальных шаблонов проектирования XSLT. –

ответ

5

Это преобразование:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:package="info:srw/extension/13/package-v1.0" > 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

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

<xsl:template match="package:packageDownloadLocator/text()"> 
    <xsl:value-of select="../preceding-sibling::*[1]/text()"/> 
</xsl:template> 
</xsl:stylesheet> 

при нанесении на предоставленном документе XML, производит желаемый результат.

Обратите внимание:

  1. Использование правила идентичности скопировать каждый узел, как есть.

  2. Переопределение правила идентификации с помощью определенного шаблона, который соответствует только требуемому текстовому узлу.

+0

Спасибо ОЧЕНЬ много Dimitre, вы оказали мне огромную помощь здесь и понимание XSLT :) – atomicjeep

0

Читайте на "Идентичность трансформации" (Google это, есть хорошая страница в Википедии). Все, что вам нужно - это преобразование идентичности плюс шаблон, соответствующий тегу, который вы хотите изменить. Вам также нужно будет решить, хотите ли вы любой предшествующий родной брат или определенный предшествующий тег (и что делать, если нет предыдущего брата).

+0

Будет благодарен Jim – atomicjeep

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