You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 23:45:40