MODX 2.8.4中citation key末尾数字无法递增的技术求助
MODX中标签key属性编号无法递增的修复方案
环境:MODX 2.8.4,PHP 7.3.33
现有一段MODX代码,用于将资源模板变量中的列表内容转换为带递增编号的<citation>标签结构,但实际输出中所有<citation>标签的key属性末尾数字始终为0,无法实现1、2、3……的递增效果。
原代码
<?php $docId = $modx->getOption('docId', $scriptProperties, ''); $tmplvarids = array( 1 => 11 ); $doitv = array( 'contentid' => $docId , 'tmplvarid' => 17 ); $doiget = $modx->getObject('modTemplateVarResource', $doitv); $doiextr = $doiget->get('value'); $doi = str_replace("10.65435/", "", $doiextr); $i = 0; foreach($tmplvarids as $tmplvarid) { $suffix = ''; $artlit = ''; $tvx = $modx->getObject('modTemplateVarResource', array('contentid' => $docId, 'tmplvarid' => $tmplvarid)); $artlit = $tvx->get('value'); $prefix = "\n" . '<citation key="key-'. $doi .'-'. $i . '">'; $str .= str_replace(array('<ul>', '</ul>', '<li>', '</li>'), array('<citation_list>', '</citation_list>', $prefix . '<unstructured_citation>', '</unstructured_citation></citation>'), $artlit); $strstrip = strip_tags($str, '<citation><citation_list><unstructured_citation>'); ++$i; } return $strstrip; }
原输出示例
<citation_list> <citation key="key-2129-8124-2022-3-81-7-12-0"> <unstructured_citation>Aliev BF.</unstructured_citation> </citation> <citation key="key-2129-8124-2022-3-81-7-12-0"> <unstructured_citation>Zyzov IM, Gazhva SI.</unstructured_citation> </citation> <citation key="key-2129-8124-2022-3-81-7-12-0"> <unstructured_citation>Mamedzade RE.</unstructured_citation> </citation> <citation key="key-2129-8124-2022-3-81-7-12-0"> <unstructured_citation>Mitronin AV, Platonova ASh</unstructured_citation> </citation> <citation key="key-2129-8124-2022-3-81-7-12-0"> <unstructured_citation>Nasirova HB.</unstructured_citation> </citation> </citation_list>
问题原因
原代码的$i仅在遍历模板变量时递增,而每个模板变量内的所有<li>项会被一次性替换为同一个$i值的<citation>标签。由于这里只有一个模板变量,所有项的编号都停留在初始的0。
修复方案
需要针对每个<li>单独递增编号,拆分列表项逐个处理:
<?php $docId = $modx->getOption('docId', $scriptProperties, ''); $tmplvarids = array( 1 => 11 ); // 获取DOI值 $doitv = array( 'contentid' => $docId, 'tmplvarid' => 17 ); $doiget = $modx->getObject('modTemplateVarResource', $doitv); $doiextr = $doiget->get('value'); $doi = str_replace("10.65435/", "", $doiextr); $str = ''; // 全局计数器,确保所有模板变量的citation编号连续递增 $citationCounter = 1; foreach($tmplvarids as $tmplvarid) { $tvx = $modx->getObject('modTemplateVarResource', array('contentid' => $docId, 'tmplvarid' => $tmplvarid)); $artlit = $tvx->get('value'); // 移除外层<ul>标签,提取<li>内容 $artlit = preg_replace('/^\s*<ul>|<\/ul>\s*$/i', '', $artlit); // 拆分所有<li>项 preg_match_all('/<li>(.*?)<\/li>/is', $artlit, $matches); if (!empty($matches[1])) { $str .= "\n<citation_list>"; foreach ($matches[1] as $item) { // 生成带递增编号的citation标签 $str .= "\n<citation key=\"key-$doi-$citationCounter\">"; $str .= "\n<unstructured_citation>" . trim($item) . "</unstructured_citation>"; $str .= "\n</citation>"; $citationCounter++; } $str .= "\n</citation_list>"; } } // 清理多余标签,保留允许的结构 $strstrip = strip_tags($str, '<citation><citation_list><unstructured_citation>'); return $strstrip; ?>
修复后输出示例
<citation_list> <citation key="key-2129-8124-2022-3-81-7-12-1"> <unstructured_citation>Aliev BF.</unstructured_citation> </citation> <citation key="key-2129-8124-2022-3-81-7-12-2"> <unstructured_citation>Zyzov IM, Gazhva SI.</unstructured_citation> </citation> <citation key="key-2129-8124-2022-3-81-7-12-3"> <unstructured_citation>Mamedzade RE.</unstructured_citation> </citation> <citation key="key-2129-8124-2022-3-81-7-12-4"> <unstructured_citation>Mitronin AV, Platonova ASh</unstructured_citation> </citation> <citation key="key-2129-8124-2022-3-81-7-12-5"> <unstructured_citation>Nasirova HB.</unstructured_citation> </citation> </citation_list>
内容的提问来源于stack exchange,提问作者Roman Sobol
相关产品推荐
相关产品推荐

