gpt4 book ai didi

xml - XSLT 在一次转换中复制、修剪、排序和删除

转载 作者:行者123 更新时间:2023-12-04 16:55:49 24 4
gpt4 key购买 nike

我有以下 XML。

<oai_dc:dc xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/">
<dc:title xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="hrv">Naslov rada</dc:title>
<dc:date xmlns:dc="http://purl.org/dc/elements/1.1/">2001-01-01</dc:date>
<dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Prezime, Ime</dc:creator>
<dc:date xmlns:dc="http://purl.org/dc/elements/1.1/">2002-02-02</dc:date>
<dc:relation xml:lang="eng">University of Zagreb. Academy of dramatic art. </dc:relation>
</oai_dc:dc>

我需要的输出是这样的:
<dc>
<creator>Prezime, Ime</creator>
<date>2002-02-02</date>
<relation lang="eng">University of Zagreb. Academy of dramatic art.</relation>
<title lang="hrv">Naslov rada</title>
</dc>

所以,我需要做的是:从属性和元素中删除命名空间。我用这段代码试过了,它有效。
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>

接下来我需要按元素名称(也可能是按属性名称)对元素进行排序。我用这段代码做到了,它有效。
 <xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="@*">
<xsl:sort select="name()"/>
</xsl:apply-templates>
<xsl:apply-templates select="node()">
<xsl:sort select="name()"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>

然后我需要删除所有以“2001”开头的元素。我用这个做了,它有效。
<xsl:template match="/dc/date[starts-with(text(), '2001')]" />

最后,我必须修剪元素中的所有文本值。注意:
<dc:relation xml:lang="eng">University of Zagreb. Academy of dramatic art. </dc:relation>

我应该从结尾(和开头)修剪空白,所以它是:
<dc:relation xml:lang="eng">University of Zagreb. Academy of dramatic art.</dc:relation>

所以我的问题是我不能让它在一个 XSLT 组合中工作。想法是:从定义命名空间的元素和属性中删除前缀(命名空间),然后对元素进行排序并删除一些特定元素(如我的情况),最后修剪所有剩余的文本值。

我做了所有这些,但有更多的转换。可以一次性完成吗?

我只能使用 XSLT 1.0

最佳答案

使用

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/"
xmlns:dc="http://purl.org/dc/elements/1.1/">

<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*">
<xsl:sort select="local-name()"/>
</xsl:apply-templates>
<xsl:apply-templates select="node()">
<xsl:sort select="local-name()"/>
</xsl:apply-templates>
</xsl:element>
</xsl:template>

<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>

<xsl:template match="/oai_dc:dc/dc:date[starts-with(text(), '2001')]" />

<xsl:template match="text()[normalize-space()]">
<xsl:value-of select="normalize-space()"/>
</xsl:template>

</xsl:transform>

创建输出( http://xsltransform.net/3NSSEvB )
<dc>
<creator>Prezime, Ime</creator>
<date>2002-02-02</date>
<relation lang="eng">University of Zagreb. Academy of dramatic art.</relation>
<title lang="hrv">Naslov rada</title>
</dc>

注意使用 normalize-space()不仅修剪前导和尾随空格,还将其他字符之间的任何空格序列替换为单个空格。

关于xml - XSLT 在一次转换中复制、修剪、排序和删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41981475/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com