如何从XML元素中删除文本,重新排列它,并将其与XSLT连接?

时间:2012-08-08 14:56:52

标签: xml xslt xpath-1.0


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

3 个答案:

答案 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>

我希望这会有所帮助