加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml – 使用xslt解析然后格式化名称

发布时间:2020-12-16 22:44:57 所属栏目:百科 来源:网络整理
导读:我正在尝试编写一个XSLT样式表来处理作者的名字并创建引用的APA版本.关于作者姓名的APA引用格式:名称列出姓氏,然后是姓名首字母,如果姓名是引文的第一个元素.使用逗号分隔名称,并在最后一位作者之前使用符号().我在这篇文章中遵循了Dimitre Novatchev的解决
我正在尝试编写一个XSLT样式表来处理作者的名字并创建引用的APA版本.关于作者姓名的APA引用格式:名称列出姓氏,然后是姓名首字母,如果姓名是引文的第一个元素.使用逗号分隔名称,并在最后一位作者之前使用&符号(&).我在这篇文章中遵循了Dimitre Novatchev的解决方案: Using XSLT to select after EACH instance in a string/substring但我没有得到我想要的结果.

输入:

<names>
    <author>Lio-Po,Gilda D.</author>
    <author>Primavera,Jurgenne H.</author>
    <author>Cuvin-Aralar,Ma. Lourdes A.</author>
    <author>Cruz,E.R.</author>
    <author>Catacutan,M.R.</author>
    <author>Agbayani,R.F.</author>
</names>

期望的输出将是:Lio-Po,G.D.,Primavera,J.H.,Cuvin-Aralar,M.L.A.,Cruz,E.R.,Catacutan,M.R.,& Agbayani,R.F.

对于只有2位作者的记录:

<names>
 <author>Lio-Po,Gilda D.</author>
 <author>Primavera,Jurgenne H.</author>
</names>

期望的输出是:Lio-Po,& Primavera,J.H.

提前致谢.下面是我的代码,其中一些代码来自Dimitre.

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

<xsl:template match="/">
    <xsl:for-each select="/names/author">
        <xsl:choose>
            <xsl:when test="count(following-sibling::text()) = 1">
                <xsl:text>&amp; </xsl:text>
                <xsl:apply-templates/>
            </xsl:when>
            <xsl:when test="count(following-sibling::text()) != 0">
                <xsl:apply-templates/>
                <xsl:text>,</xsl:text>
            </xsl:when>
        </xsl:choose>
    </xsl:for-each>
</xsl:template>

<xsl:template match="text()">
    <xsl:value-of select="substring-before(.,',')"/>

    <xsl:call-template name="replaceTokenDelims">
        <xsl:with-param name="pStr" select="concat(normalize-space(substring-after(.,')),' ')"/>
        <xsl:with-param name="pToken" select="' '"/>
        <xsl:with-param name="pReplacement" select="','"/>
    </xsl:call-template>
</xsl:template>

<xsl:template name="replaceTokenDelims">
    <xsl:param name="pStr"/>
    <xsl:param name="pToken"/>
    <xsl:param name="pReplacement"/>

    <xsl:if test="$pStr">
        <xsl:value-of select="$pReplacement"/>
        <xsl:value-of select="substring(substring-before($pStr,$pToken),1,1)"/>

        <xsl:call-template name="replaceTokenDelims">
            <xsl:with-param name="pStr" select="substring-after($pStr,$pToken)"/>
            <xsl:with-param name="pToken" select="$pToken"/>
            <xsl:with-param name="pReplacement" select="$pReplacement"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

?运行上面的代码给出了输出:Lio-Po,G,D,J,H,M,L,A,E,R

解决方法

更新

这个有用,我甚至自己测试过:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:str="http://exslt.org/strings">
<xsl:output  method="text" />
<xsl:template match="/">
    <xsl:for-each select="/names/author">
    <xsl:if test="position() = last()">
        <xsl:text>&amp; </xsl:text>
    </xsl:if>
    <xsl:for-each select="str:tokenize(.,' ')">
        <xsl:choose>
          <xsl:when test="position() = 1">
            <xsl:value-of select="."></xsl:value-of>
          </xsl:when>
          <xsl:when test="substring(.,2,1) = '.'">
            <xsl:for-each select="str:tokenize(.,'.')">           
                <xsl:value-of select="concat(.,'.')"></xsl:value-of>
                <xsl:if test="position() != last()">
                    <xsl:text> </xsl:text>
                </xsl:if>
            </xsl:for-each>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="concat(substring(.,1),'.')"></xsl:value-of>
          </xsl:otherwise>
        </xsl:choose>       
        <xsl:choose>
          <xsl:when test="position() = last()">
            <xsl:text>,</xsl:text>
          </xsl:when>
          <xsl:otherwise>
            <xsl:text> </xsl:text>
          </xsl:otherwise>
        </xsl:choose>       

    </xsl:for-each>

    </xsl:for-each>
</xsl:template>

您给定XML的输出将是:

Lio-Po,G. D.,J. H.,M. L. A.,E. R.,M. R.,R. F.,

如果你能忍受最后一个额外的逗号;)

附加:
这是我测试过的完整java代码,看起来还不错.

import java.io.File;
import java.io.IOException;
import java.io.StringWriter;

import javax.xml.transform.TransformerException;

public class XLSTTester {

    public static void main(String[] params){
        try {
            transform("d:workspace1test.xml","d:workspace1test.xsl");
        } catch (TransformerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private static void transform(String xmlFileFullPath,String xsltFileFullPath) throws TransformerException,IOException{
        File xmlFile = new File(xmlFileFullPath);
        File xsltFile = new File(xsltFileFullPath);
        StringWriter sw = new StringWriter();
        javax.xml.transform.Source xmlSource = new javax.xml.transform.stream.StreamSource(xmlFile);
        javax.xml.transform.Source xsltSource = new javax.xml.transform.stream.StreamSource(xsltFile); 
        javax.xml.transform.Result transResult = new javax.xml.transform.stream.StreamResult(sw);  

//          create an instance of TransformerFactory
        javax.xml.transform.TransformerFactory transFact = javax.xml.transform.TransformerFactory.newInstance(  );

        javax.xml.transform.Transformer trans = transFact.newTransformer(xsltSource);
        trans.transform(xmlSource,transResult);
    }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读