2010-07-09 130 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設計模式之一的完整解決方案。 – 2010-07-09 15:57:50

回答

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 2010-07-12 10:29:55

0

閱讀上的 「身份轉換」(谷歌一下,有一個在維基百科的一個很好的頁面)。所有你需要的是一個身份轉換加上一個匹配你想改變的標籤的模板。您還需要決定是否需要之間的任何之前的兄弟,或者特定的前面的標記(以及如果沒有兄弟之前應該怎麼做)。

+0

謝謝Jim – atomicjeep 2010-07-09 15:46:35

相關問題