XSLT 1.0:优化超大文档中文本值调整的匹配/逻辑效率
用XSLT 1.0基于兄弟节点ID条件修改病历文本(从恒等模板出发)
听起来你已经找对了核心方向——从恒等模板入手绝对是正确选择,毕竟要完整保留所有病历内容,只做局部文本调整。我来给你拆解具体的实现思路和可直接复用的代码示例:
1. 先搭好恒等模板的基础
恒等模板是XSLT里的"保底逻辑",会原样复制所有节点、属性和文本,确保没有任何病历内容丢失:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 恒等模板:原样复制所有内容的基础框架 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template>
2. 添加目标节点的匹配模板(优先级高于恒等)
接下来写一个专门匹配你要修改的特定节点的模板,在里面加入兄弟节点ID的判断逻辑。假设你要修改的是<clinical-note>节点,它的兄弟节点是<patient-id>,且目标ID列表是ID01到ID10,可以这么实现:
<!-- 匹配需要调整的目标节点,仅当兄弟节点包含指定ID时生效 --> <xsl:template match="clinical-note[../patient-id[contains('|ID01|ID02|ID03|ID04|ID05|ID06|ID07|ID08|ID09|ID10|', concat('|', text(), '|'))]]"> <xsl:copy> <!-- 这里替换成你需要调整后的文本逻辑 --> <xsl:text>【受限记录】</xsl:text> <xsl:value-of select="text()"/> <!-- 也可以完全替换原文本,比如直接写固定内容 --> </xsl:copy> </xsl:template> </xsl:stylesheet>
3. 关键细节说明
- 可靠的ID匹配方式:用
|把所有目标ID包裹成字符串,再用concat('|', text(), '|')把当前ID也包裹起来,能避免部分匹配的坑(比如不会把ID011误判成ID01)。 - 上下文路径调整:
../patient-id表示当前节点的父节点下的<patient-id>兄弟节点,如果你的节点层级不同,记得调整路径——比如同级节点可以用following-sibling::patient-id或preceding-sibling::patient-id。 - 文本调整灵活性:你可以完全替换原文本,也可以在前后追加内容,只要不删除原节点结构就符合要求。
4. 适配你的实际XML结构
如果你的病历XML结构是这样的:
<medical-record> <patient-info> <id>ID03</id> <name>张三</name> </patient-info> <clinical-note>原始病历描述文本</clinical-note> </medical-record>
要修改<clinical-note>的文本,匹配模板的路径就要调整为:
<xsl:template match="clinical-note[../patient-info/id[contains('|ID01|ID02|...|ID10|', concat('|', text(), '|'))]]"> <!-- 这里写你的文本调整逻辑 --> </xsl:template>
这样就能确保所有病历内容完整保留,只有符合条件的特定节点文本被调整,完全契合你的需求。
内容的提问来源于stack exchange,提问作者WinterSoldier
相关产品推荐
相关产品推荐

