首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使转换后的元素成为兄弟姐妹的子元素

使转换后的元素成为兄弟姐妹的子元素
EN

Stack Overflow用户
提问于 2015-03-10 18:52:09
回答 1查看 26关注 0票数 1

我正在对下面的xml进行MODS转换。为了清楚起见,我大大简化了它:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<OAI-PMH>
  <metadata>
    <mods>
      <genre>Negatives (photographic)</genre>
      <genre>Cellulose nitrate film</genre>
      <physicalDescription>
        <form>Photograph</form>
      </physicalDescription>
    </mods>
</metadata></OAI-PMH>

我需要这个结果,其中已经将genre元素变成了form元素,这些元素是已经存在的physicalTransform元素的子元素:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<OAI-PMH>
  <metadata>
    <mods>
      <physicalDescription>
        <form>Photograph</form>
        <form>Negatives (photographic)</form>
        <form>Cellulose nitrate film</form>
      </physicalDescription>
    </mods>
</metadata></OAI-PMH>

我该怎么做呢?我试过这样做:

代码语言:javascript
复制
<xsl:template match="mods:physicalDescription">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:apply-templates select="mods:genre"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="mods:genre">
    <xsl:element namespace="http://www.loc.gov/mods/v3" name="form" >
        <xsl:value-of select="normalize-space(.)"/>

    </xsl:element>
 
</xsl:template>

但这是行不通的。我确信我错过了一些简单的东西,但我无法确定是什么。任何帮助都将不胜感激。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-10 19:11:42

您指的是名称空间,但没有在输入XML中声明此命名空间。我假设它是一个默认名称空间:

XML输入

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<OAI-PMH xmlns="http://www.loc.gov/mods/v3">
  <metadata>
    <mods>
      <genre>Negatives (photographic)</genre>
      <genre>Cellulose nitrate film</genre>
      <physicalDescription>
        <form>Photograph</form>
      </physicalDescription>
    </mods>
</metadata>
</OAI-PMH>

在您发布的样式表中,应该删除一些不可见的空格字符。此外,还应该有一种机制来生成输入的忠实副本,在此基础上您可以定义更改--这称为身份模板。

然后,在mods:physicalDescription的模板匹配中,查找所有属于同级元素的mods:genre元素,并在相同的命名空间中为每个元素输出一个元素form

添加最后一个与mods:genre匹配的模板,不再需要单独处理它们。

XSLT样式表

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:mods="http://www.loc.gov/mods/v3"
exclude-result-prefixes="mods">

    <xsl:output method="xml" encoding="UTF-8" indent="yes" />
    <xsl:strip-space elements="*"/>

    <xsl:template match="mods:physicalDescription">
        <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:for-each select="../mods:genre">
            <form xmlns="http://www.loc.gov/mods/v3">
                <xsl:apply-templates select="@*|node()"/>
            </form>
        </xsl:for-each>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="mods:genre"/>

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

</xsl:transform>

XML输出

如您所见,这将产生您所请求的输出,但不包括默认名称空间。

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<OAI-PMH xmlns="http://www.loc.gov/mods/v3">
   <metadata>
      <mods>
         <physicalDescription>
            <form>Photograph</form>
            <form>Negatives (photographic)</form>
            <form>Cellulose nitrate film</form>
         </physicalDescription>
      </mods>
   </metadata>
</OAI-PMH>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28971820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档