如何解决如何在XSLT中使用同级元素值插入新元素
我有一个XML文件,需要添加一个新元素,其中包含来自XSLT兄弟元素的值。我有这个:
<?xml version="1.0" encoding="UTF-8"?>
<collection
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"
xmlns="http://www.loc.gov/MARC21/slim">
<record>
<datafield tag="035" ind1=" " ind2=" ">
<subfield code="a">(OCoLC)ocm02255682</subfield>
</datafield>
<datafield tag="959" ind1=" " ind2=" ">
<subfield code="a">(MILdb)299946</subfield>
</datafield>
<datafield tag="959" ind1=" " ind2=" ">
<subfield code="a">(UIUdb)3899758</subfield>
</datafield>
</record>
我需要的是这个
<?xml version="1.0" encoding="UTF-8"?>
<collection
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"
xmlns="http://www.loc.gov/MARC21/slim">
<record>
<datafield tag="035" ind1=" " ind2=" ">
<subfield code="a">(OCoLC)ocm02255682</subfield>
</datafield>
<datafield tag="035" ind1=" " ind2=" ">
<subfield code="z">(UIU)Voyager3899758</subfield>
</datafield>
<datafield tag="959" ind1=" " ind2=" ">
<subfield code="a">(MILdb)299946</subfield>
</datafield>
<datafield tag="959" ind1=" " ind2=" ">
<subfield code="a">(UIUdb)3899758</subfield>
</datafield>
</record>
我已经工作了几个小时,没有任何有意义的输出。任何帮助将不胜感激。
这是我到目前为止所拥有的。这是我尝试编写的第一个XSLT,但我不确定自己是否走对了。输出具有新字段(但由于某些原因带有名称空间),并且不包含来自959子字段的值元素。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:marc="http://www.loc.gov/MARC21/slim"
version="1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="marc:record">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<datafield tag="035" ind1=" " ind2=" ">
<subfield code="z">(UIU)Voyager
<xsl:value-of select="marc:datafield[@tag=959]/marc:subfield[@code='a']"/>
</subfield>
</datafield>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
解决方法
AFAICT,您想这样做:
XSLT 1.0
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.13.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.13.1/umd/react-dom.production.min.js"></script>
<div id="root"></div>
已添加:
要仅在其<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:marc="http://www.loc.gov/MARC21/slim"
xmlns="http://www.loc.gov/MARC21/slim"
exclude-result-prefixes="marc">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="marc:record">
<xsl:copy>
<xsl:apply-templates/>
<datafield tag="035" ind1=" " ind2=" ">
<subfield code="z">
<xsl:text>(UIU)Voyager</xsl:text>
<xsl:value-of select="substring-after(marc:datafield[@tag=959]/marc:subfield[@code='a'],')')"/>
</subfield>
</datafield>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
值为datafield
并且以tag
开头的959
的{{1}}时创建新元素,请更改第二个模板到:
subfield
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。