如何在XSLT中正确编辑节点值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在XSLT中正确编辑节点值相关的知识,希望对你有一定的参考价值。

在下面的XML代码中,我尝试编辑文本节点<key id="fileOriginalPath">/exlibris1/transfer/lza-tib/submission.tib/ingest/GBV626375266/content/streams/DERIVATIVE_COPY/626375266.pdf</key>并将其缩短为:

`<key id="fileOriginalPath">/GBV626375266/content/streams/DERIVATIVE_COPY/626375266.pdf</key>`

所以应删除部分/exlibris1/transfer/lza-tib/submission.tib/ingest这是我的XSLT,但问题是它不会对XML进行任何更改:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:mets="http://www.loc.gov/METS/"
    xmlns:xlin="http://www.w3.org/1999/xlink"
    exclude-result-prefixes="#all"
    version="3.0">


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

  <xsl:template match="record/key[@id='fileOriginalPath']/text()[. = '/exlibris1/transfer/lza-tib/submission.tib/ingest/GBV626375266/content/streams/DERIVATIVE_COPY/626375266.pdf']">GBV626375266/content/streams/DERIVATIVE_COPY/626375266.pdf</xsl:template>

</xsl:stylesheet>

那是原始的XML:

<?xml version="1.0" encoding="UTF-8"?><mets:mets xmlns:mets="http://www.loc.gov/METS/">
<mets:amdSec ID="fid1-2-amd">
    <mets:techMD ID="fid1-2-amd-tech">
      <mets:mdWrap MDTYPE="OTHER" OTHERMDTYPE="dnx">
        <mets:xmlData>
          <dnx xmlns="http://www.exlibrisgroup.com/dps/dnx">
            <section id="generalFileCharacteristics">
              <record>
                <key id="label">Das physikalische Praktikum : Handbuch 2010 für Studentinnen und Studenten der Physik ; mit 21 Tabellen</key>
                <key id="fileMIMEType">application/pdf</key>
                <key id="note">Das physikalische Praktikum : Handbuch 2010 für Studentinnen und Studenten der Physik ; mit 21 Tabellen : application/pdf</key>
                <key id="fileOriginalPath">/exlibris1/transfer/lza-tib/submission.tib/ingest/GBV626375266/content/streams/DERIVATIVE_COPY/626375266.pdf</key>
              </record>
            </section>
            <section id="fileFixity">
              <record>
                <key id="fixityType">MD5</key>
                <key id="fixityValue">763faa0ad3bcbdf6618acecbc7044fb3</key>
              </record>
            </section>
          </dnx>
        </mets:xmlData>
      </mets:mdWrap>
    </mets:techMD>
    <mets:rightsMD ID="fid1-2-amd-rights">
      <mets:mdWrap MDTYPE="OTHER" OTHERMDTYPE="dnx">
        <mets:xmlData>
          <dnx xmlns="http://www.exlibrisgroup.com/dps/dnx"/>
        </mets:xmlData>
      </mets:mdWrap>
    </mets:rightsMD>
    <mets:sourceMD ID="fid1-2-amd-source">
      <mets:mdWrap MDTYPE="OTHER" OTHERMDTYPE="dnx">
        <mets:xmlData>
          <dnx xmlns="http://www.exlibrisgroup.com/dps/dnx"/>
        </mets:xmlData>
      </mets:mdWrap>
    </mets:sourceMD>
    <mets:digiprovMD ID="fid1-2-amd-digiprov">
      <mets:mdWrap MDTYPE="OTHER" OTHERMDTYPE="dnx">
        <mets:xmlData>
          <dnx xmlns="http://www.exlibrisgroup.com/dps/dnx"/>
        </mets:xmlData>
      </mets:mdWrap>
    </mets:digiprovMD>
  </mets:amdSec>
 </mets:mets>
答案

问题是dnx及其下的所有内容都在默认命名空间中。

您需要在XSLT中考虑到这一点,否则您的xpath将在无命名空间中查找元素。

正如您使用XSLT 3.0,您可以使用xpath-default-namespace来处理它。 (这也适用于XSLT 2.0)。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:mets="http://www.loc.gov/METS/"
    xmlns:xlin="http://www.w3.org/1999/xlink"
    xpath-default-namespace="http://www.exlibrisgroup.com/dps/dnx"
    exclude-result-prefixes="#all"
    version="3.0">

顺便说一下,也许你让你的模板更通用......

<xsl:template match="record/key[@id='fileOriginalPath']/text()[starts-with(., '/exlibris1/transfer/lza-tib/submission.tib/ingest')]">
  <xsl:value-of select="substring(., 51)" />
</xsl:template>

编辑:如果你想使用变量(或参数),你可以......

<xsl:param name="path" select="'/exlibris1/transfer/lza-tib/submission.tib/ingest'" />

<xsl:template match="record/key[@id='fileOriginalPath']/text()[starts-with(., $path)]">
  <xsl:value-of select="substring(., string-length($path) + 1" />
</xsl:template>

以上是关于如何在XSLT中正确编辑节点值的主要内容,如果未能解决你的问题,请参考以下文章

在 XSLT 中,如何使用存在多个相同节点的 ID 从节点中选择一个值?

从另一个节点 xslt 调用值

XSLT muenchian 在子节点中按值分组

XSLT如何仅对XML文档的字符串节点中的数值进行排序

如何获取具有相同名称的元素并根据 XSLT 中的子节点值对它们进行排序

XSLT:如何将节点值传递给自定义 xsl:function ?