1


考虑以下 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(不起作用):

<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> ,但无法连接或剥离其子元素......

4

3 回答 3

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>
于 2012-08-08T15:09:42.757 回答
1

除非我错过了重点,否则将您的 Authors 模板更改为以下内容应该可以:

<!-- 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>
于 2012-08-08T15:14:08.383 回答
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>

我希望这会有所帮助

于 2012-08-08T15:14:14.917 回答