Пропуск числа в XSLT - PullRequest
       0

Пропуск числа в XSLT

2 голосов
/ 21 июля 2011

часть моего xml-файла:

<Global>
<GlobalParam name="RollName" value="Scene" 10:00:00:00" />
<GlobalParam name="TapeOrg" value="10:00:00:00" />
<GlobalParam name="ReadStart" value="00:00:00:00" />
<GlobalParam name="ReadDuration" value="00:02:05:09" />
</Global>  

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

 <xsl:template match="GlobalParam">
    <GlobalParam>
        <xsl:attribute name="name">
            <xsl:value-of select="@name" />
        </xsl:attribute>
        <xsl:attribute name="value">
            <xsl:value-of select="@value" />
        </xsl:attribute>
    </GlobalParam>
</xsl:template>

это было бы нормально, но программное обеспечение, которое выводит это, если обрабатывает файл (как вы можете видеть выше, добавляет 10: 00: 00: 00 к имени файла и XML-файлу, мне нужно удалить оба но я могу обработать выходное имя файла, когда я делаю перевод.

Мне нужно удалить 10:00:00:00" из поля имени рулона, но оставить имя без изменений Однако я смотрел на схему XSLT, и я не могу найти подходящую функцию для обработки этого. Не очень опытный с XSLT, я могу полностью убрать поле, но, ну, это мне не поможет.

Есть ли способ сделать это, возможно, исключив число, если оно его найдет, или пробелом между именем и разделом времени?.

Любое понимание было бы замечательно

Спасибо.

Ответы [ 2 ]

3 голосов
/ 21 июля 2011

Как написано в комментариях, ваш входной текст не является правильно сформированным XML-документом и, вероятно, должен быть исправлен вашим провайдером. Для временного исправления вы можете использовать какой-либо внешний инструмент, например, sed вместо XSLT. Я не говорю, что вы не можете использовать его (проверьте этот ответ для более подробной информации), но ИМХО это не адекватная работа для XSLT.

sed 's/ 10:00:00:00"//' input.xml

Результат:

<Global>
    <GlobalParam name="RollName" value="Scene" />
    <GlobalParam name="TapeOrg" value="10:00:00:00" />
    <GlobalParam name="ReadStart" value="00:00:00:00" />
    <GlobalParam name="ReadDuration" value="00:02:05:09" />
</Global>

EDIT:

Вот решение на основе XSLT 2.0 (протестировано на Saxon-HE 9.3 ):

stylesheet.xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

    <xsl:variable name="input" select="unparsed-text('input.xml')"/>

    <xsl:template name="main">
        <xsl:analyze-string select="$input" regex=' 10:00:00:00"'>
            <xsl:non-matching-substring>
                <xsl:value-of select="."/>
            </xsl:non-matching-substring>
        </xsl:analyze-string>
    </xsl:template>
</xsl:stylesheet>

input.xml (неправильно сформированный):

<Global>
<GlobalParam name="RollName" value="Scene" 10:00:00:00" />
<GlobalParam name="TapeOrg" value="10:00:00:00" />
<GlobalParam name="ReadStart" value="00:00:00:00" />
<GlobalParam name="ReadDuration" value="00:02:05:09" />
</Global>

CLI:

java -jar saxon9he.jar -it:main -xsl:stylesheet.xsl -o:output.xml

Результат (output.xml):

<Global>
<GlobalParam name="RollName" value="Scene" />
<GlobalParam name="TapeOrg" value="10:00:00:00" />
<GlobalParam name="ReadStart" value="00:00:00:00" />
<GlobalParam name="ReadDuration" value="00:02:05:09" />
</Global>
1 голос
/ 22 июля 2011

Вам необходимо применить предварительную обработку для входного файла.Если вы используете .NET, вы можете использовать этот код для удаления 10:00:00:00".

var result = Regex.Replace(input, @"(?s)(?<!=""\s*)10:00:00:00""", string.Empty);

Regex (?s)(?<!="\s*)10:00:00:00" найдет все 10:00:00:00", которые не имеют =" в префиксе.

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