考虑以下XML:
<root>
<contrib contrib-type="author">
<name>
<last-name>Simpson</last-name>
<first-name>Bart</first-name>
</name>
</contrib>
<contrib contrib-type="author">
<name>
<last-name>Zoidberg</last-name>
<first-name>Dr.</first-name>
</name>
</contrib>
</root>
...如何转换这些元素的内容以获得此输出?
<Authors contrib-type="author">Bart Simpson</Authors>
<Authors contrib-type="author">Dr. Zoidberg</Authors>
<first-name>
的内容与<last-name>
的内容以及以单个空格分隔的内容进行连接。
Authors
的任何子元素(如果可能,删除<name>
,<first-name>
和<last-name>
元素。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" method="xml"/>
<xsl:strip-space elements="*"/>
<!-- identity rule -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- Authors -->
<xsl:template match="contrib[@contrib-type='author']">
<Authors>
<xsl:apply-templates select="@*|node()"/>
<xsl:value-of select = "concat(given-names, surname)" />
</Authors>
</xsl:template>
</xsl:stylesheet>
到目前为止,我能够将<contrib>
元素转换为<Authors>
,但无法连接或剥离其'子元素...
答案 0 :(得分:2)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<root>
<xsl:apply-templates select="/root/contrib"/>
</root>
</xsl:template>
<!-- Authors -->
<xsl:template match="contrib[@contrib-type='author']">
<Authors>
<xsl:copy-of select="@*"/>
<xsl:value-of select="name/first-name"/>
<xsl:text> </xsl:text>
<xsl:value-of select="name/last-name"/>
</Authors>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
除非我忽略了这一点,否则将作者模板更改为以下内容应该有效:
<!-- Authors -->
<xsl:template match="contrib[@contrib-type='author']">
<Authors>
<xsl:apply-templates select="@*"/>
<xsl:value-of select = "concat(normalize-space(name/first-name/text()),
' ',
normalize-space(name/last-name/text()))" />
</Authors>
</xsl:template>
输出:
<root>
<Authors contrib-type="author">Bart Simpson</Authors>
<Authors contrib-type="author">Dr. Zoidberg</Authors>
</root>
答案 2 :(得分:1)
试试这个:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" method="xml"/>
<xsl:strip-space elements="*"/>
<!-- identity rule -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- Authors -->
<xsl:template match="contrib[@contrib-type='author']">
<Authors contrib-type="{@contrib-type}">
<xsl:value-of select = "concat(name/first-name, ' ', name/last-name)" />
</Authors>
</xsl:template>
</xsl:stylesheet>
我希望这会有所帮助