шаблон с указанным режимом не соответствует проблеме - PullRequest
0 голосов
/ 18 февраля 2020

Мне нужно вычислить несколько значений и сохранить их в переменной. Я передаю узел документа в xsl:apply-templates и задаю режим:

<xsl:variable as="xs:string*" name="checkAccidentalsVisibility">        
    <xsl:apply-templates  mode="checkAccidentalsVisibility" select="$extractMainVersion"/>  
</xsl:variable>

Но шаблон для этого режима не совпадает:

<xsl:template match="body//@accid[not(parent::accid/@func[. = 'caution'] or ancestor::note[@grace])]" mode="checkAccidentalsVisibility" >...

Шаблон преобразования идентификаторов указан следующим образом , bcs Мне не нужно копировать дерево xml.

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

Значением $ checkAccidentalsVisibility является текстовый узел. Например, применительно к этому XML я получаю пример :

<?xml version="1.0" encoding="UTF-8"?>
    <mei meiversion="3.0.0" xml:id="dme92517025-f4c2-4231-a1c3-b70f02802d61" xmlns="http://www.music-encoding.org/ns/mei">
        <meiHead meiversion="3.0.0">
            <fileDesc>
                <titleStmt>
                    <title label="NMA digital" type="unit">an example</title>
                </titleStmt>
                <pubStmt/>
            </fileDesc>
        </meiHead>
        <music meiversion="3.0.0">
            <body>
                <mdiv n="2a" xml:id="mdiv_">
                    <score xml:id="score_">                     
                        <section label="menuetto_A" xml:id="section_A_m1-5">
                            <measure n="1" xml:id="m1_k_">
                                <staff n="1" xml:id="staff_108">
                                    <layer n="1" xml:id="layer_114">
                                        <note accid.ges="f" dur="2" oct="4" pname="e" tstamp="1" xml:id="note_120"/>
                                        <choice xml:id="choice_132">
                                            <sic xml:id="corr_132">
                                                <note dur="4" oct="4" pname="e" tstamp="3" xml:id="note_132">
                                                    <accid accid="f"  xml:id="accid_138"/>
                                                </note>
                                            </sic>
                                            <orig xml:id="orig_132">
                                                <note dur="4" oct="4" pname="e" tstamp="3" xml:id="note_132b">
                                                    <accid accid="f"  xml:id="accid_138b"/>
                                                </note>
                                            </orig>
                                        </choice>
                                    </layer>
                                </staff>
                            </measure>
                        </section>
                    </score>
                </mdiv>
            </body>
        </music>
    </mei>

Я ожидаю последовательность @ xml: id-значений, которые я получаю из своих вычислений.

Ответы [ 4 ]

1 голос
/ 09 апреля 2020

Как Майкл Кей указал, что это отсутствующее переопределение для шаблона атрибута по умолчанию, последнее выглядит примерно так:

<xsl:template match="@*">
  <xsl:value-of select="."/>
</xsl:template>

Так что вы должны добавить что-то похожее на:

<xsl:template match="node()|@*" mode="checkAccidentalsVisibility">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
1 голос
/ 18 февраля 2020

Насколько я могу судить по предоставленным фрагментам кода, вы не определили какой-либо "запасной" шаблон для режима checkAccidentalsVisibility, поэтому при применении-шаблонов к узлу документа в этом режиме встроенный шаблон вступают в силу правила, а правило по умолчанию для элементов использует apply-templates для обработки дочерних элементов элемента, но не его атрибутов. Таким образом, атрибуты не обрабатываются.

0 голосов
/ 18 февраля 2020

Весь xslt довольно большой и модульный. Я не знаю, как можно разместить здесь все содержимое ... Например, это основная таблица стилей:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet exclude-result-prefixes="xs xd mei dme map" version="3.0" xmlns:dme="http://www.mozarteum.at/ns/dme" xmlns:map="http://www.w3.org/2005/xpath-functions/map" xmlns:mei="http://www.music-encoding.org/ns/mei" xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="http://www.music-encoding.org/ns/mei">


    <xsl:include href="modules/basic.xsl"/>
    <xsl:include href="modules/extractMainVersion.xsl"/>
    <xsl:include href="modules/check_contextNote.xsl"/>
    <xsl:include href="modules/changeAccid.xsl"/>


    <xsl:variable as="xs:string*" name="checkAccidentalsVisibility">
        <xsl:variable name="extractMainVersion">
            <xsl:apply-templates mode="extractMainVersion" select="."/>
        </xsl:variable>
        <xsl:apply-templates  mode="checkAccidentalsVisibility" select="$extractMainVersion//@accid"/>
    </xsl:variable>

    <xd:doc>
        <xd:desc/>
    </xd:doc>
    <xsl:template match="/">
        <xsl:apply-templates mode="changeAccid" select="."/>
    </xsl:template>

</xsl:stylesheet>

Шаблон

<xsl:template match="body//@accid[not(parent::accid/@func[. = 'caution'] or ancestor::note[@grace])]" mode="checkAccidentalsVisibility" >...

помещен в check_contextNote.xsl , И это единственный шаблон с режимом checkAccidentalsVisibility , но позже он вызывает множество других шаблонов и функций.

Изначально у меня не было $ checkAccidentalsVisibility, и мне не нужно было иметь различные режимы и шаблон был подобран хорошо. Позже мне нужно было изменить лог программы c и отделить следующее:

  1. Изменить исходный узел документа () на основе вычисленных значений
  2. Значения должны быть рассчитаны из модифицированного document-node () (это то, что содержит $ extractMainVersion)

Итак, я добавил три режима. Два из них я добавил в шаблон преобразования идентификаторов (изначально он был установлен на #all). Это basi c .xsl :

   <xsl:stylesheet exclude-result-prefixes="xs xd mei dme map" version="3.0" xmlns:dme="http://www.mozarteum.at/ns/dme" xmlns:map="http://www.w3.org/2005/xpath-functions/map" xmlns:mei="http://www.music-encoding.org/ns/mei" xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="http://www.music-encoding.org/ns/mei">

        <xsl:output encoding="UTF-8" indent="yes" method="xml"/>
        <xsl:strip-space elements="*"/>

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

    </xsl:stylesheet>
0 голосов
/ 18 февраля 2020

При явной передаче атрибутов @select они сопоставляются. Итак:

<xsl:apply-templates  mode="checkAccidentalsVisibility" select="$extractMainVersion//@accid"/>

соответствует здесь:

<xsl:template match="body//@accid[not(parent::accid/@func[. = 'caution'] or ancestor::note[@grace])]" mode="checkAccidentalsVisibility">

@ Martin Honnen: $extractMainversion содержит узел документа со значением <#documentfragment>, которое почти совпадает с XML фрагмент выше. $checkAccidentalsVisibility ранее содержал строку, полученную из //title/text() Возможно, я не очень хорошо ее описал.

Хотя я решил проблему, мне было бы интересно, почему вы не можете сопоставить @attributes в Кстати, как вы обычно делаете это без режимов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...