最好只使用XML中的一个实体,以便XML解析器在解析文档时为您扩展该实体。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root[
<!ENTITY Widget_Manual "Widget_Manual_File_Name.pdf" >
]>
<root>
<!-- I want to convert this to "Widget_Manual_File_Name.pdf" in the transform -->
<widget entityIdent="&Widget_Manual;" />
</root>
如果您没有对XML的控制权,并且希望在XSLT中执行查找/替换,那么您将不得不跳过一些循环。XSLT对已经分析过的XML进行操作,并且DTD内容在XML信息集中不能直接寻址。
但是,您可以获得
base-uri()
然后使用
unparsed-text()
将XML作为字符串读取,然后使用
replace()
具有捕获组(或子字符串函数)以获取实体值的regex。
可以使用以下XSLT2.0样式表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@entityIdent">
<xsl:attribute name="{name()}">
<xsl:value-of select="replace(
unparsed-text(base-uri()),
concat('.*!ENTITY ', ., ' "(.+?)".*'),
'$1',
's')"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>