【问题标题】:XSLT - replace value in one node with the value from it's preceeding siblingXSLT - 将一个节点中的值替换为其前一个兄弟节点中的值
【发布时间】:2011-03-13 20:42:39
【问题描述】:

我正在尝试编写一个 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>

【问题讨论】:

  • 好问题 (+1)。请参阅我的答案,了解采用最基本 XSLT 设计模式之一的完整解决方案。

标签: xml search xslt xpath replace


【解决方案1】:

阅读“身份转换”(谷歌它,维基百科上有一个很好的页面)。您所需要的只是一个身份转换以及一个与您要更改的标签匹配的模板。您还必须决定是要 any 前面的兄弟,还是特定的前面标记(如果没有前面的兄弟,该怎么办)。

【讨论】:

    【解决方案2】:

    这种转变

    <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. 使用仅匹配所需文本节点的特定模板覆盖身份规则

    【讨论】:

    • 非常感谢 Dimitre,您在这里给了我大量的帮助以及对 XSLT 的深入了解 :)
    猜你喜欢
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多