如何正确使用两个数据字段逗号隔开逗号?
我已经按照我的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
你在想像一个程序化程序员。不要使用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>
究竟包含pica036C
变量你的代码? 这是一个包含2个项目的数组,取自datafield
标签。
而现在,究竟包含了第一项:
- 文本节点 - 空间和\ N个开数据字段标签 和第一打开子标签之间。
- 第一个子字段标记。
- 另一个文本节点 - 空间和\ n第一闭合之间子场 标签和第二开口子场标签。
- 依此类推。
所以datafield[@tag='036c'][1]
指的是仅包含“白色”字符的节点 字符。下一个要连接的项目是', '
,这就是你看到的 作为“最初的”逗号。
还记得,<xsl:for-each select="$pica036C">
内部循环 .
指的是pica036C
数组中的当前元素。
所以,如果你想获得subfield
,写subfield
,没有 父节点,其只存在在源文件的名称,但不是在pica036C
。
我的建议:
-
创建
pica036C
变量是这样的:<xsl:variable name="pica036C" as="text()*"> <xsl:for-each select="recordData/record/datafield[@tag='036C']"> <xsl:value-of select="string-join(subfield, '
')"/> </xsl:for-each> </xsl:variable>
你得到也有2项的数组,每个包含加入了子场 从各自的数据字段,但没有空白它们之间的文本节点在 之间。
string-join
的第二个参数,而不是

(换行符) 可以是一个空格(对您的最终结果更好)。 -
创建
titleFrom036C
这样:<xsl:variable name="titleFrom036C" select= "concat($pica036C[1], ',
', $pica036C[2])" />
然后,当你使用如
<xsl:value-of select="$titleFrom036C"/>
您将得到:- 第一次出版物的全称。
- 逗号和换行符。
- 第二次出版物的全称。
看看这有助于:http://*.com/a/28774515/3016153如果不是,请编辑你的问题,并发布你想要得到确切的结果。 –
这没有帮助。在我的例子中,逗号不会出现在最后一个元素之后。但它出现在第一个不正确的地方 –
看起来你可能想要容纳两个以上具有相同标记的''元素。是这样吗?因为如果你可以依靠那里总是有两个,那么这很容易。 –