XSLT 复制、Trim、排序和删除一次转换
XSLT Copy, Trim, Sort and Delete in one transform
我有以下 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>
所以,我需要做的是:从属性和元素中删除 namespaces。我用这段代码试过了,它起作用了。
<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')]" />
最后,我必须 trim 元素中的所有文本值。注意:
<dc:relation xml:lang="eng">University of Zagreb. Academy of dramatic art. </dc:relation>
我应该从结尾(和开头)trim 白色 space,所以它是:
<dc:relation xml:lang="eng">University of Zagreb. Academy of dramatic art.</dc:relation>
所以我的问题是我无法让它在一个 XSLT 组合中工作。想法是:从定义 namespaces 的元素和属性中删除前缀(namespaces),然后对元素进行排序并删除一些特定元素(如我的情况),最后 trim 所有剩余的文本值。
我做了所有这些,但不止一次转换。是否可以一次完成?
我只能使用 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()
不仅 trim 前导和尾随白色 space,而且还将其他字符之间的任何白色序列 space 替换为单个字符space.
我有以下 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>
所以,我需要做的是:从属性和元素中删除 namespaces。我用这段代码试过了,它起作用了。
<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')]" />
最后,我必须 trim 元素中的所有文本值。注意:
<dc:relation xml:lang="eng">University of Zagreb. Academy of dramatic art. </dc:relation>
我应该从结尾(和开头)trim 白色 space,所以它是:
<dc:relation xml:lang="eng">University of Zagreb. Academy of dramatic art.</dc:relation>
所以我的问题是我无法让它在一个 XSLT 组合中工作。想法是:从定义 namespaces 的元素和属性中删除前缀(namespaces),然后对元素进行排序并删除一些特定元素(如我的情况),最后 trim 所有剩余的文本值。
我做了所有这些,但不止一次转换。是否可以一次完成?
我只能使用 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()
不仅 trim 前导和尾随白色 space,而且还将其他字符之间的任何白色序列 space 替换为单个字符space.