代码之家  ›  专栏  ›  技术社区  ›  atomicjeep

xslt-将一个节点中的值替换为其上一个同级节点中的值

  •  3
  • atomicjeep  · 技术社区  · 14 年前

    我正在尝试编写一个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>
    
    2 回复  |  直到 14 年前
        1
  •  5
  •   Dimitre Novatchev    14 年前

    这种转变 :

    <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. 用特定模板覆盖标识规则 只匹配所需的文本节点。

        2
  •  0
  •   Jim Garrison    14 年前

    阅读“身份转换”(google it,wikipedia有一个很好的页面)。您所需要的只是一个身份转换加上一个与您要更改的标记匹配的模板。你还得决定是否需要 任何 前一个兄弟姐妹,或特定的前一个标记(如果没有前一个兄弟姐妹,该怎么做)。