2010-07-09 135 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

相关问题