将一个 xml 文件中的值合并到另一个文件中。
incorporate values from one xml file into another.
我有以下 xml 个文件(我们称它们为 paragraph.xml 和 sentence.xml)。
Paragraph.xml
<?xml version="1.0" encoding="UTF-8"?>
<paragraphs>
<paragraph id="par_1" parBegin="1" parEnd="100" par_type="intro" context="positive"/>
<paragraph id="par_2" parBegin="101" parEnd="170" par_type="elaboration" context="negative"/>
<paragraph id="par_3" parBegin="171" parEnd="210" par_type="elaboration" context="positive"/>
<paragraph id="par_4" parBegin="211" parEnd="280" par_type="conclusion" context="neutral"/>
在paragraph.xml文件中,属性“parBegin”显示段落开始的字数,“parEnd”显示段落结束的单词数。例如,第一段元素以单词 1(parBegin 属性的值)开始,以单词 100 结束(第一段有 100字)。
另一个 xml 文件 sentence.xml 包含有关同一文本的句子的信息。
<?xml version="1.0" encoding="UTF-8"?>
<sentences>
<sentence id="sent_1" sentBegin="1" sentEnd="15" sent_type="question"/>
<sentence id="sent_2" sentBegin="16" sentEnd="30" sent_type="imperative"/>
<sentence id="sent_3" sentBegin="31" sentEnd="37" sent_type="confirmation"/>
...
<sentence id="sent_15" sentBegin="120" sentEnd="125" sent_type="conclusion" />
在sentence.xml文件中,属性“sentBegin”显示句子开头的单词编号,“sentEnd”显示段落结束的单词数。例如,第一个句子元素以单词 1(sentBegin 属性的值)开始,并以单词 15 结束。 id="sent_15" 的句子从第 120 个单词 (sentBegin="120") 开始到第 125 个单词 (sentEnd="125") 结束。
我想做的是检查每个句子属于哪个段落。换句话说,比较属性的值@sentEnd 与属性值 @parEnd。如果段落元素的 @sentEnd 大于 @parBegin 且小于 @parEnd,则显示该句子属于该段落。例如,句子 (id="sent_15") 的 sentEnd 值为 125 (sentEnd="125"),它大于 @parBegin (parBegin="101") 具有 id="par_2" 且小于其 @parEnd 的段落的值 ( parEnd="170") 值。这表明句子id="sent_15"属于段落id="par_2"。所需的输出如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<sentences>
<sentence id="sent_1" sentBegin="1" sentEnd="15" sent_type="question" paragraph="par_1" par_type="intro"/>
<sentence id="sent_2" sentBegin="16" sentEnd="30" sent_type="imperative" paragraph="par_1" par_type="intro"/>
<sentence id="sent_3" sentBegin="31" sentEnd="37" sent_type="confirmation" paragraph="par_1" par_type="intro"/>
...
<sentence id="sent_15" sentBegin="120" sentEnd="125" sent_type="conclusion" paragraph="par_2" par_type="elaboration" />
非常感谢您的feedback/solution。
看起来你可以简单地 select 正确的 paragraph
和谓词:
<xsl:template match="sentence">
<xsl:copy>
<xsl:apply-templates
select="@*,
$paragraph-doc/paragraphs/paragraph[xs:integer(@parBegin) <= xs:integer(current()/@sentBegin) and xs:integer(@parEnd) >= xs:integer(current()/@sentEnd)]/(@id, @par_type)"/>
</xsl:copy>
</xsl:template>
在下文中,我在参数中内联了段落文档,但您当然可以使用 doc
函数加载它:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:param name="paragraph-doc">
<paragraphs>
<paragraph id="par_1" parBegin="1" parEnd="100" par_type="intro" context="positive"/>
<paragraph id="par_2" parBegin="101" parEnd="170" par_type="elaboration" context="negative"/>
<paragraph id="par_3" parBegin="171" parEnd="210" par_type="elaboration" context="positive"/>
<paragraph id="par_4" parBegin="211" parEnd="280" par_type="conclusion" context="neutral"/>
</paragraphs>
</xsl:param>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="sentence">
<xsl:copy>
<xsl:apply-templates
select="@*,
$paragraph-doc/paragraphs/paragraph[xs:integer(@parBegin) <= xs:integer(current()/@sentBegin) and xs:integer(@parEnd) >= xs:integer(current()/@sentEnd)]/(@id, @par_type)"/>
</xsl:copy>
</xsl:template>
<xsl:template match="paragraph/@id">
<xsl:attribute name="paragraph" select="."/>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/nc4NzQZ 是一个 XSLT 3 示例,对于 XSLT 2,您需要将使用的 xsl:mode
声明替换为身份转换模板。
作为上述方法的改进或替代方法,我们可以在 @parBegin to @parEnd
上键入 paragraph
元素,然后使用该键从句子中找到相关段落:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:param name="paragraph-doc">
<paragraphs>
<paragraph id="par_1" parBegin="1" parEnd="100" par_type="intro" context="positive"/>
<paragraph id="par_2" parBegin="101" parEnd="170" par_type="elaboration" context="negative"/>
<paragraph id="par_3" parBegin="171" parEnd="210" par_type="elaboration" context="positive"/>
<paragraph id="par_4" parBegin="211" parEnd="280" par_type="conclusion" context="neutral"/>
</paragraphs>
</xsl:param>
<xsl:key name="par-ref" match="paragraph" use="@parBegin to @parEnd"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="sentence">
<xsl:copy>
<xsl:apply-templates
select="@*,
key('par-ref', xs:integer(@sentEnd), $paragraph-doc)/(@id, @par_type)"/>
</xsl:copy>
</xsl:template>
<xsl:template match="paragraph/@id">
<xsl:attribute name="paragraph" select="."/>
</xsl:template>
</xsl:stylesheet>
我有以下 xml 个文件(我们称它们为 paragraph.xml 和 sentence.xml)。
Paragraph.xml
<?xml version="1.0" encoding="UTF-8"?>
<paragraphs>
<paragraph id="par_1" parBegin="1" parEnd="100" par_type="intro" context="positive"/>
<paragraph id="par_2" parBegin="101" parEnd="170" par_type="elaboration" context="negative"/>
<paragraph id="par_3" parBegin="171" parEnd="210" par_type="elaboration" context="positive"/>
<paragraph id="par_4" parBegin="211" parEnd="280" par_type="conclusion" context="neutral"/>
在paragraph.xml文件中,属性“parBegin”显示段落开始的字数,“parEnd”显示段落结束的单词数。例如,第一段元素以单词 1(parBegin 属性的值)开始,以单词 100 结束(第一段有 100字)。
另一个 xml 文件 sentence.xml 包含有关同一文本的句子的信息。
<?xml version="1.0" encoding="UTF-8"?>
<sentences>
<sentence id="sent_1" sentBegin="1" sentEnd="15" sent_type="question"/>
<sentence id="sent_2" sentBegin="16" sentEnd="30" sent_type="imperative"/>
<sentence id="sent_3" sentBegin="31" sentEnd="37" sent_type="confirmation"/>
...
<sentence id="sent_15" sentBegin="120" sentEnd="125" sent_type="conclusion" />
在sentence.xml文件中,属性“sentBegin”显示句子开头的单词编号,“sentEnd”显示段落结束的单词数。例如,第一个句子元素以单词 1(sentBegin 属性的值)开始,并以单词 15 结束。 id="sent_15" 的句子从第 120 个单词 (sentBegin="120") 开始到第 125 个单词 (sentEnd="125") 结束。
我想做的是检查每个句子属于哪个段落。换句话说,比较属性的值@sentEnd 与属性值 @parEnd。如果段落元素的 @sentEnd 大于 @parBegin 且小于 @parEnd,则显示该句子属于该段落。例如,句子 (id="sent_15") 的 sentEnd 值为 125 (sentEnd="125"),它大于 @parBegin (parBegin="101") 具有 id="par_2" 且小于其 @parEnd 的段落的值 ( parEnd="170") 值。这表明句子id="sent_15"属于段落id="par_2"。所需的输出如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<sentences>
<sentence id="sent_1" sentBegin="1" sentEnd="15" sent_type="question" paragraph="par_1" par_type="intro"/>
<sentence id="sent_2" sentBegin="16" sentEnd="30" sent_type="imperative" paragraph="par_1" par_type="intro"/>
<sentence id="sent_3" sentBegin="31" sentEnd="37" sent_type="confirmation" paragraph="par_1" par_type="intro"/>
...
<sentence id="sent_15" sentBegin="120" sentEnd="125" sent_type="conclusion" paragraph="par_2" par_type="elaboration" />
非常感谢您的feedback/solution。
看起来你可以简单地 select 正确的 paragraph
和谓词:
<xsl:template match="sentence">
<xsl:copy>
<xsl:apply-templates
select="@*,
$paragraph-doc/paragraphs/paragraph[xs:integer(@parBegin) <= xs:integer(current()/@sentBegin) and xs:integer(@parEnd) >= xs:integer(current()/@sentEnd)]/(@id, @par_type)"/>
</xsl:copy>
</xsl:template>
在下文中,我在参数中内联了段落文档,但您当然可以使用 doc
函数加载它:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:param name="paragraph-doc">
<paragraphs>
<paragraph id="par_1" parBegin="1" parEnd="100" par_type="intro" context="positive"/>
<paragraph id="par_2" parBegin="101" parEnd="170" par_type="elaboration" context="negative"/>
<paragraph id="par_3" parBegin="171" parEnd="210" par_type="elaboration" context="positive"/>
<paragraph id="par_4" parBegin="211" parEnd="280" par_type="conclusion" context="neutral"/>
</paragraphs>
</xsl:param>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="sentence">
<xsl:copy>
<xsl:apply-templates
select="@*,
$paragraph-doc/paragraphs/paragraph[xs:integer(@parBegin) <= xs:integer(current()/@sentBegin) and xs:integer(@parEnd) >= xs:integer(current()/@sentEnd)]/(@id, @par_type)"/>
</xsl:copy>
</xsl:template>
<xsl:template match="paragraph/@id">
<xsl:attribute name="paragraph" select="."/>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/nc4NzQZ 是一个 XSLT 3 示例,对于 XSLT 2,您需要将使用的 xsl:mode
声明替换为身份转换模板。
作为上述方法的改进或替代方法,我们可以在 @parBegin to @parEnd
上键入 paragraph
元素,然后使用该键从句子中找到相关段落:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:param name="paragraph-doc">
<paragraphs>
<paragraph id="par_1" parBegin="1" parEnd="100" par_type="intro" context="positive"/>
<paragraph id="par_2" parBegin="101" parEnd="170" par_type="elaboration" context="negative"/>
<paragraph id="par_3" parBegin="171" parEnd="210" par_type="elaboration" context="positive"/>
<paragraph id="par_4" parBegin="211" parEnd="280" par_type="conclusion" context="neutral"/>
</paragraphs>
</xsl:param>
<xsl:key name="par-ref" match="paragraph" use="@parBegin to @parEnd"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="sentence">
<xsl:copy>
<xsl:apply-templates
select="@*,
key('par-ref', xs:integer(@sentEnd), $paragraph-doc)/(@id, @par_type)"/>
</xsl:copy>
</xsl:template>
<xsl:template match="paragraph/@id">
<xsl:attribute name="paragraph" select="."/>
</xsl:template>
</xsl:stylesheet>