Проблема с & apos; переводится в 'при обработке с xlst - PullRequest
0 голосов
/ 30 октября 2009

У меня есть .xslt, который переводит xml из одной формы в другую (я не использую и xsd, поэтому я не буду говорить из одной схемы в другую). Моя проблема в том, что исходная кодировка файла & apos; теряется в переводе. Это вызывает у меня проблему, потому что в моей базе данных имена хранятся с использованием символа апостроф, а не символа одинарной кавычки, и когда я выполняю обновление с этими новыми данными, имена не совпадают, потому что в базе данных есть апострофы в именах и Код обновления Java, который читает мой переведенный XML-файл, содержит одинарные кавычки.

Исходный файл имеет различные списки элементов карты, которые выглядят так (обратите внимание на значение элемента name):

    <card>
        <cost>4BB</cost>
        <color>Black</color>
        <expansion-set>
            <rarity>R</rarity>
            <abbreviation>UD</abbreviation>
        </expansion-set>
        <type>Enchantment</type>
        <ruling>Vintage tournaments (see Rule 901) have restricted this
            card since 1999/10/01.</ruling>
        <ruling>Legacy tournaments (see Rule 902) have banned this card
            since 1999/10/01.</ruling>
        <ruling>Extended tournaments (see Rule 903) have banned this
            card since 1999/08/01.</ruling>
        <note>Note - Also see Skip, Rule G19.11.</note>
        <text>Text(UD): Skip your draw step. ; Pay 1 life: Draw a card.</text>
        <name>Yawgmoth&apos;s Bargain</name>
    </card>

Это то, что шаблон xslt соответствует элементам карты и создает новую форму, которую я ищу:

    <xsl:template match="card">
        <card name="{name}">
            <!-- Add the card name -->
<!--            <xsl:attribute name="name">
                <xsl:value-of select="name"/>
            </xsl:attribute>
            <cardname><xsl:value-of select="name"/></cardname>  -->
            <!-- Add the card's rulings -->
            <xsl:apply-templates select="ruling"/>
            <!-- Add the card's notes -->
            <xsl:apply-templates select="note"/>
        </card>
    </xsl:template>

Как видите, я не переношу все, что мне нужно, и превращаю элемент name в атрибут (я пытался сохранить имя как элемент, но вижу ту же проблему). Закомментированные части - это другие попытки, которые я предпринял, чтобы получить желаемый вывод (текущее преобразование и все закомментированные все приводят к одинаковому использованию одинарной кавычки, а не апострофа).

Вот как элемент карты выглядит в переведенном выводе (обратите внимание на другое значение атрибута name):

<card name="Yawgmoth's Bargain">
<ruling ruleref="901">Vintage tournaments (see Rule 901) have restricted this card since 1999/10/01.</ruling>
<ruling ruleref="902">Legacy tournaments (see Rule 902) have banned this card since 1999/10/01.</ruling>
<ruling ruleref="903">Extended tournaments (see Rule 903) have banned this card since 1999/08/01.</ruling>
<note ruleref="G19.11">Note - Also see Skip, Rule G19.11.</note>
</card>

Теперь, когда мой код обновления базы данных (написанный на Java) читает в этом XML, сделка Yawgmoth содержит символ одинарной кавычки в строке, но база данных, которую я создал, имеет имя с использованием символа апостроф. Излишне говорить, что мой код обновления не совпадает с названиями карт.

Что является причиной потери точности в преобразовании xsl?

спасибо,

Ian

1 Ответ

2 голосов
/ 30 октября 2009

&apos; в xml использует предопределенную ссылку на сущность для ', которая представляет собой номер символа Unicode 39 (шестнадцатеричное 27), а APOSTROPHE, равный ', - то, что вы имеете в своих выходных данных.

Ваша проблема не в процессоре xslt.

Полагаю, вы получаете один из символов одинарных кавычек: ПРАВАЯ ОДНОКВАЖНАЯ КВАРТИРА (гекс, 2019). В этом случае что-то еще (уровень вашей базы данных?) «Изощряет» ваш символ апострофа.

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