有没有办法在XML元素中引用字符

时间:2016-07-24 07:05:47

标签: xml

我有一个XML文档,其文档结构包含元素章节,段落,文章,部分,小节。我想为这些元素中的部分文本提供意义。

例如,部分文本可能显示为“参考区域内的建筑物不得高于25米”。我想引用“25”并赋予它“max building height”的含义,因此它是机器可解释的。我可以通过在文本中添加XML元素来实现这一点。例如:

<text>A building within the referenced area may no not be higher than <meaning type="max building height">25</meaning>m.</text>

我更希望将意义与文本分开,如果可能的话,保留原始XML文档。是否可以在另一个XML文档的元素中引用部分文本?

示例源文档:

<document>
    <chapter id="5"><text>Building regulations</text>
        <article id="102"><text>Build</text>
            <section id="1a">
                <text>A building within the referenced area may no not be higher than 25m.</text>
            </section>
        </article>
    </chapter>
</document>

示例意义文件:

<meaning>
    <reference type="max building height" ref="..." start="..." end="..." />
</meaning>

1 个答案:

答案 0 :(得分:0)

我之前关于从文本字符串中提取具有上下文含义的值的评论仍然适用,但这里有几个例子可以帮助你,

我的(首选)方法基于这样一个事实,即建筑物规则通常是精确定义的,并且最大高度应该从章节/物品/部分ID中知道。

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>


<xsl:template match="chapter[@id='5']/article[@id='102']/section[@id='1a']/text">
<text>
    <xsl:value-of select="substring-before(.,'25')"/>
    <meaning type="max building height">25</meaning>
    <xsl:value-of select="substring-after(.,'25')"/>
</text>
</xsl:template>

如果你不知道最大高度是“25”,需要提取它。

这个版本并不完美(因为从字符串中提取数字并不简单!)。例如,如果你需要提取一个带有小数部分的数字(比如12.5),那么这个方法需要更多的工作,因为众所周知,句点(。)也用于结束一个句子。 还有许多其他案例可以打破它。

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="text">
<text>
    <xsl:variable name="tokens" select="fn:tokenize(.,' ')"/>
    <xsl:for-each select="$tokens">
        <xsl:variable name="v" select="fn:translate(.,'abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.','')"/>
        <xsl:choose>
            <xsl:when test="string(number($v)) != 'NaN' ">
                <xsl:value-of select="substring-before(.,$v)"/>
                <meaning type="max building height"><xsl:value-of select="$v"/></meaning>
                <xsl:value-of select="substring-after(.,$v)"/>
                <xsl:text> </xsl:text>          
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="."/>
                <xsl:text> </xsl:text>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each>
    </text>
</xsl:template>