Как сопоставить ключевые слова в заданном предложении для создания выражений Schematron XSLT 2.0 или 3.0 - PullRequest
1 голос
/ 07 марта 2019

Я какое-то время занимался проблемой, связанной с несколькими заданными предложениями и ключевыми словами, мне нужно сопоставить ключевые слова, найти их в предложении и создать еще одну строку на основе порядка предложения для каждого ключевого слова. .

Таким образом, список ключевых слов не должен следовать тому же порядку, что и в предложении. Но порядок должен совпадать, как в предложении Надеюсь, это ясно.

Пример XML:

<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<LIST>
    <ID>1</ID>
    <MESSAGE>Cats(13) are "lovely" or "beautiful" and Dogs(10) are "loyal" or "friendly".</MESSAGE>
</LIST>
<LIST>
    <ID>2</ID>
    <MESSAGE>Horses(11) are not a "good" option and Pigs(12) are okay</MESSAGE>
</LIST>
<ADJS>
    <ADJ>lovely</ADJ>
</ADJS>
<ADJS>
    <ADJ>friendly</ADJ>
</ADJS>
<ADJS>
    <ADJ>beautiful</ADJ>
</ADJS>
<ADJS>
    <ADJ>loyal</ADJ>
</ADJS>
<ADJS>
    <ADJ>good</ADJ>
</ADJS>
 <ADJS>
    <ADJ>okay</ADJ>
</ADJS>
<KEYWORDS>
    <ID>10</ID>
    <KEYWORD>Dogs</KEYWORD>
</KEYWORDS>
<KEYWORDS>
    <ID>11</ID>
    <KEYWORD>Horses</KEYWORD>
</KEYWORDS>
<KEYWORDS>
    <ID>12</ID>
    <KEYWORD>Pigs</KEYWORD>
</KEYWORDS>
<KEYWORDS>
    <ID>13</ID>
    <KEYWORD>Cats</KEYWORD>
</KEYWORDS>
<KEYWORDS>
    <ID>14</ID>
    <KEYWORD>aquarium</KEYWORD>
</KEYWORDS>
<KEYWORDS>
    <ID>b</ID>
    <KEYWORD>Fishes</KEYWORD>
</KEYWORDS>
<OP>
    <SYNTAX>and</SYNTAX>
</OP>
<OP>
    <SYNTAX>or</SYNTAX>
</OP>
<OP>
    <SYNTAX>are not</SYNTAX>
</OP>
<OP>
    <SYNTAX>are</SYNTAX>
</OP>

XSLT, который я вроде попробовал:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:functx="http://www.functx.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:function name="functx:contains-any-of" as="xs:boolean">
    <xsl:param name="arg" as="xs:string?"/>
    <xsl:param name="searchStrings" as="xs:string*"/>
    <xsl:sequence select="
            some $searchString in $searchStrings
                satisfies contains($arg, $searchString)
            "/>
</xsl:function>
<xsl:template match="ROOT">
    <xsl:variable name="keyID" select="//KEYWORDS/ID"/>
    <xsl:variable name="keyName" select="//KEYWORDS/KEYWORD"/>
    <xsl:variable name="keyOp" select="//OP/SYNTAX"/>
    <xsl:for-each select="//MESSAGE">
        <xsl:variable name="message" select="node()"/>
        <xsl:if test="functx:contains-any-of($message, $keyID)">

            <xsl:element name="test">
                <xsl:value-of select="$keyName"/>
                <xsl:value-of select="$keyOp"/>
            </xsl:element>

            </xsl:if>
    </xsl:for-each>
</xsl:template>

Ожидаемый результат:

<test>Cats = ('lovely','beautiful') and Dogs = ('loyal','friendly')</test>
<test>Horses != 'good' or Pigs = 'okay'</test> 

Дело в том, что здесь все преобразовано из файла Excel, и я пытаюсь сделать это автоматически. из Excel в Schematron. в этой части я уже конвертировал Excel в XML.

Теперь я пытаюсь получить определения Xpath из предложений, используя ключевые слова. Потому что эти ключевые слова являются динамическими. Если он имеет шансы в Excel, он должен полностью перейти на схематрон.

Мне нужно найти эти ключевые слова в предложениях по порядку предложений. и операторы и прилагательные, а также. Поэтому я могу создавать выражения, как я пытался показать в ожидаемом выводе.

Я не могу изменить порядок или структуру предложения. Основная идея здесь - создать определение Xpath из предложений.

UPDATE

Итак, из одного из постов Мартина Хоннена я узнал, что в XSLT 2.0 возможно $name = ('Alice', 'Bob', 'Cindy').

UPDATE-2

<xsl:variable name="operator" select="$btbg/node()/SimpleCodeList/Row/Value[@ColumnRef = 'DictionaryEntryName']/SimpleValue/text()"/>
<xsl:copy>
        <xsl:variable name="w" select="tokenize(., '\s+')"/>
        <xsl:value-of select="$w[position() &gt; index-of($w, $w[. = $operator][1])]"/>
</xsl:copy>

Я думал об этой идее поместить предложение в цикл после того, как оно найдет ключевое слово до конца. Но также не мог заставить его работать. $operator параметр приходит из другого файла XML. Если я делаю это таким образом, я не могу получить значение рекурсивно. Он читает все операторы или любые другие параметры в XML.

Я хочу выбрать узлы один за другим и найти их в предложении. затем вырежьте предложение там после прочтения значения и снова поместите предложение в цикл для следующего ключевого слова.

Как я могу преодолеть эту проблему? Заранее спасибо.

...