使转换后的元素成为兄弟姐妹的 child
making a transformed element the child of a sibling
我正在对以下 xml 进行 MODS 到 MODS 的转换。为了清楚起见,我大大简化了它:
<?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
个元素是 children 已经存在的 physicalTransform
个元素:
<?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>
我该怎么做?我试过这个:
<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>
但它不起作用。我确信我遗漏了一些简单的东西,但我无法确定是什么。任何帮助将不胜感激。谢谢。
您指的是命名空间,但未在您的输入中声明此命名空间 XML。我假设它是默认命名空间:
XML 输入
<?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 样式表
<?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输出
如您所见,除了您未包含的默认命名空间外,这会生成您所请求的输出。
<?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>
我正在对以下 xml 进行 MODS 到 MODS 的转换。为了清楚起见,我大大简化了它:
<?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
个元素是 children 已经存在的 physicalTransform
个元素:
<?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>
我该怎么做?我试过这个:
<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>
但它不起作用。我确信我遗漏了一些简单的东西,但我无法确定是什么。任何帮助将不胜感激。谢谢。
您指的是命名空间,但未在您的输入中声明此命名空间 XML。我假设它是默认命名空间:
XML 输入
<?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 样式表
<?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输出
如您所见,除了您未包含的默认命名空间外,这会生成您所请求的输出。
<?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>