2017-04-21 168 views
0

我已经按照我的XML 2周的Datafields:如何正确使用两个数据字段逗号隔开逗号?

<datafield tag="036C"> 
<subfield code="a">Ėkonomičeskaja politika Rossii v uslovijach globalʹnoj turbulentnosti</subfield> 
<subfield code="y">meždunarodnyj finansovo-ėkonomičeskij forum - 2014 (24-26 nojabrja, Moskva)</subfield> 
<subfield code="c">Finansovyj universitet pri pravitelʹstve Rossijskoj Federacii</subfield> 
<subfield code="l">tom 3</subfield></datafield> 

<datafield tag="036C" occurrence="01"> 
<subfield code="a">Materialy zasedanij kruglych stolov</subfield> 
<subfield code="l">Čast 2</subfield> 
</datafield> 

我试图在XSLT之间用逗号将它们连接起来:

<xsl:variable name="pica036C" 
         select="recordData/record/datafield[@tag='036C']" /> 

    <xsl:variable name="titleFrom036C"> 

          <xsl:for-each select="$pica036C"> 
          <xsl:value-of select="concat(datafield[@tag='036c'][1], ', ', datafield[@tag='036c'][2])" />  
</xsl:for-each> 
</xsl:variable> 

的问题是,我得到太多的逗号。第一个始终在第一个数据字段036c(,Ėkonomičeskaja)之前。它应该被删除。第二个是在两个数据字段之间 - 这是正确的。如何删除第一个逗号?

实际: ,Ėkonomičeskaja政治报ROSSII v uslovijach global'noj turbulentnosti:meždunarodnyjfinansovo-ėkonomičeskij论坛动态 - 2014年(24-26 nojabrja,火车头);汤姆3,Materialy zasedanij kruglych stolov;投2

必须(第一逗号被删除,逗号 “汤姆3” 之后残留): Ėkonomičeskaja政治报ROSSII v uslovijach global'noj turbulentnosti:meždunarodnyjfinansovo-ėkonomičeskij论坛 - 2014(24-26 nojabrja,火车头);汤姆3,Materialy zasedanij kruglych stolov; Čast2

+1

看看这有助于:http://stackoverflow.com/a/28774515/3016153如果不是,请编辑你的问题,并发布你想要得到确切的结果。 –

+0

这没有帮助。在我的例子中,逗号不会出现在最后一个元素之后。但它出现在第一个不正确的地方 –

+0

看起来你可能想要容纳两个以上具有相同标记的''元素。是这样吗?因为如果你可以依靠那里总是有两个,那么这很容易。 –

回答

2

你在想像一个程序化程序员。不要使用xsl:for-each,其中XSL对节点集成员的自然迭代处理就足够了。如果您想在给定节点的转换中进行特殊处理(例如没有前导逗号),请考虑给它自己的模板。

这里,你可以应用这些原理来实现你仿佛想一个相当简单的方法(我在一些你忽略的细节来猜测了一下):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" /> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="record"> 
    <!-- a different set of datafields could be selected instead by applying 
     this template with a different value for this parameter: --> 
    <xsl:param name="tag" select="'036C'"/> 

    <xsl:apply-templates select="datafield[@tag=$tag][1]"/> 
    <xsl:apply-templates select="datafield[@tag=$tag][position() > 1]" mode="concat" /> 
    </xsl:template> 

    <xsl:template match="datafield" mode="concat"> 
    <!-- prepend a ", " to the default transformation of this element --> 
    <xsl:text>, </xsl:text><xsl:apply-templates select="."/> 
    </xsl:template> 

    <xsl:template match="datafield"> 
    <xsl:apply-templates select="subfield[@code='a']"/> 
    <xsl:apply-templates select="subfield[@code='y']"> 
     <xsl:with-param name="delim" select="' : '"/> 
    </xsl:apply-templates> 
    <xsl:apply-templates select="subfield[@code='l']"> 
     <xsl:with-param name="delim" select="' ; '"/> 
    </xsl:apply-templates> 
    </xsl:template> 

    <xsl:template match="subfield"> 
    <xsl:param name="delim"/> 
    <xsl:value-of select="$delim"/> 
    <xsl:value-of select="."/> 
    </xsl:template> 

</xsl:stylesheet> 
2

究竟包含pica036C变量你的代码? 这是一个包含2个项目的数组,取自datafield标签。

而现在,究竟包含了第一项:

  • 文本节点 - 空间和\ N个开数据字段标签 和第一打开标签之间
  • 第一个子字段标记。
  • 另一个文本节点 - 空间和\ n第一闭合之间子场 标签和第二开口子场标签。
  • 依此类推。

所以datafield[@tag='036c'][1]指的是仅包含“白色”字符的节点 字符。下一个要连接的项目是', ',这就是你看到的 作为“最初的”逗号。

还记得,<xsl:for-each select="$pica036C">内部循环 .指的是pica036C数组中的当前元素。

所以,如果你想获得subfield,写subfield,没有 父节点,其只存在在源文件的名称,但不是在pica036C

我的建议:

  1. 创建pica036C变量是这样的:

    <xsl:variable name="pica036C" as="text()*"> 
        <xsl:for-each select="recordData/record/datafield[@tag='036C']"> 
        <xsl:value-of select="string-join(subfield, '&#xA;')"/> 
        </xsl:for-each> 
    </xsl:variable> 
    

    你得到也有2项的数组,每个包含加入了子场 从各自的数据字段,但没有空白它们之间的文本节点在 之间。

    string-join的第二个参数,而不是&#xA;(换行符) 可以是一个空格(对您的最终结果更好)。

  2. 创建titleFrom036C这样:

    <xsl:variable name="titleFrom036C" select= 
        "concat($pica036C[1], ',&#xA;', $pica036C[2])" /> 
    

    然后,当你使用如<xsl:value-of select="$titleFrom036C"/> 您将得到:

    • 第一次出版物的全称。
    • 逗号和换行符。
    • 第二次出版物的全称。