2014-02-03 2 views
0

У меня есть документ xml, скажем 300 записей. Я просматриваю каждую запись и, если выполняются определенные критерии, я записываю данные в текстовый файл с линией перевода после каждой записи , У меня есть ожидаемая работа, за исключением того факта, что после печати последней записи добавляется пробел, и это приводит к ошибке в системе, получающей файл. Я не могу использовать позицию, поскольку последняя запись в моем xml не всегда соответствует критериям. Любые мысли о том, как включить перевод строки для каждой записи, за исключением последнего совпадения?XSL-печать строки, но оставьте последний разрыв строки

<Worker> 
    - <Group name="Employee Changes"> 
     <Field name="LastName">Jones</Field> 
     <Field name="OriginalHireDt">03211977</Field> 
     <Field name="ParticipationDt">05011977</Field> 
    </Group> 
</Worker> 
<Worker> 
    - <Group name="Employee Changes"> 
     <Field name="LastName">Smith</Field> 
     <Field name="OriginalHireDt">03211977</Field> 
     <Field name="ParticipationDt">05011977</Field> 
    </Group> 
</Worker> 
<Worker> 
    - <Group name="Employee Changes"> 
     <Field name="LastName">Smith</Field> 
     <Field name="OriginalHireDt">03211977</Field> 
     <Field name="ParticipationDt">05011977</Field> 
    </Group> 
</Worker> 

XSLT

<xsl:strip-space elements="Worker_Sync"/>  
<xsl:template match="Worker_Sync"> 

      <xsl:apply-templates/> 

</xsl:template> 
<xsl:template match="Worker"> 


    <xsl:for-each select="Group[Field[@name = 'LastName'] = 'Smith']"> 
     <xsl:value-of select="upper-case(Field[@name = 'LastName'])"/> 
     <xsl:value-of select="position()"/>, last 
     <xsl:value-of select="last()"/><br/> 
    </xsl:for-each> 

</xsl:template> 

NEW XML

<Worker> 
    - <Group name="Employee Changes"> 
     <Field name="LastName">Jones</Field> 
     <Field name="OriginalHireDt">03211977</Field> 
     <Field name="ParticipationDt">05011977</Field> 
     <Field name="Fulltime">False</Field> 
    </Group> 
</Worker> 
<Worker> 
    - <Group name="Employee Changes"> 
     <Field name="LastName">Smith</Field> 
     <Field name="OriginalHireDt">03211977</Field> 
     <Field name="ParticipationDt">05011977</Field> 
     <Field name="Fulltime">False</Field> 
    </Group> 
</Worker> 
<Worker> 
    - <Group name="Employee Changes"> 
     <Field name="LastName">Smith</Field> 
     <Field name="OriginalHireDt">03211977</Field> 
     <Field name="ParticipationDt">05011977</Field> 
     <Field name="Fulltime">False</Field> 
    </Group> 
</Worker> 
<Worker> 
    - <Group name="Employee Changes"> 
     <Field name="LastName">Jones</Field> 
     <Field name="OriginalHireDt">03211977</Field> 
     <Field name="ParticipationDt">05011977</Field> 
     <Field name="Fulltime">True</Field> 
    </Group> 
</Worker> 
<Worker> 
    - <Group name="Employee Changes"> 
     <Field name="LastName">Jones</Field> 
     <Field name="OriginalHireDt">03211977</Field> 
     <Field name="ParticipationDt">05011977</Field> 
     <Field name="Fulltime">False</Field> 
    </Group> 
</Worker> 

Ожидаемый результат Смит (перевод строки) Смит (перевод строки) Джонс - Матч (без перевода строки)

Так что я хочу, чтобы выбрать кого-нибудь с фамилией Смит и написать свою фамилию только и кто-нибудь с Fulltime = true и напишет их фамилию и слово Fulltime ... Я думал, что смогу решить вторую часть, как только у меня будет первая часть, но это было не так.

+1

XSL не выводит ничего не сказать ему, чтобы вывести. Вы не предоставили нам достаточно информации, чтобы дать вам конкретный совет, но ответ заключается в том, чтобы переписать логику стилей, чтобы она не делала этого. Или исправьте другое приложение, чтобы он имел интеллект, чтобы игнорировать эту строку. Если вы хотите, чтобы мы сказали что-то еще, вам нужно дать нам что-то конкретное для работы; mindreading недоступен как бесплатный сервис. – keshlam

+1

Добро пожаловать в StackOverflow. Пожалуйста, добавьте свой вопрос в свой XML-код ввода, ваш XSLT-код, ожидаемый результат XML и тот, который вы действительно получите. –

+0

Извините за недостаток информации. Я понимаю, что xsl не выводит ничего, что я не могу сказать. Внутри оператора if я пишу необходимые данные, а также строку для каждой записи, которая соответствует критериям. Моя проблема заключается в том, что когда последняя запись сопоставляется, строка-строка записывается и остается в файле. Я просто искал рекомендации о том, как переписать таблицу стилей, чтобы включить перевод строки после всех записей, но последний, который соответствует. Изменение нисходящей системы не является вариантом. Заранее благодарим за любую помощь, которую вы можете предоставить. – user3266089

ответ

1

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

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

<Worker_Sync> 
    <Worker> 
     <Group name="Employee Changes"> 
      <Field name="LastName">Jones</Field> 
      <Field name="OriginalHireDt">03211977</Field> 
      <Field name="ParticipationDt">05011977</Field> 
     </Group> 
    </Worker> 
    <Worker> 
     <Group name="Employee Changes"> 
      <Field name="LastName">Smith</Field> 
      <Field name="OriginalHireDt">03211977</Field> 
      <Field name="ParticipationDt">05011977</Field> 
     </Group> 
    </Worker> 
    <Worker> 
     <Group name="Employee Changes"> 
      <Field name="LastName">Smith</Field> 
      <Field name="OriginalHireDt">03211977</Field> 
      <Field name="ParticipationDt">05011977</Field> 
     </Group> 
    </Worker> 
</Worker_Sync> 

вы можете использовать следующую таблицу стилей:

<?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" encoding="utf-8"/> 

<xsl:template match="/"> 
    <xsl:for-each select="Worker_Sync/Worker/Group[Field[@name='LastName']='Smith']"> 
     <xsl:value-of select="upper-case(Field[@name='LastName'])"/> 
     <xsl:if test="position()!=last()"> 
      <xsl:text>&#10;</xsl:text> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

произвести следующий текст вывод:

SMITH 
SMITH 

Примечание что после последнего SMITH нет линии.


EDIT: Если я правильно понимаю ваше измененное требование, попробуйте:

<?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" encoding="utf-8"/> 

<xsl:template match="/"> 
    <xsl:for-each select="Worker_Sync/Worker/Group[Field[@name='LastName']='Smith' 
                or 
                Field[@name='Fulltime']='True']"> 
     <xsl:value-of select="upper-case(Field[@name='LastName'])"/> 
     <xsl:if test="Field[@name='Fulltime']='True'"> 
      <xsl:text> - Fulltime</xsl:text> 
     </xsl:if> 
     <xsl:if test="position()!=last()"> 
      <xsl:text>&#10;</xsl:text> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 
+0

Теперь я собираюсь замутить воды, которые, как я думаю, и не уверен, что я прошу, можно сделать. Предположим, у меня было 2 дополнительных рабочих записей с фамилией Flynn и дополнительное поле с именем Fulltime – user3266089

+0

Новый XML-код и ожидаемые результаты, отправленные в оригинальное сообщение .. Думаю, что я смогу выработать вторую часть, но не повезло. .. Спасибо заранее за любую помощь, которую вы можете предоставить – user3266089

+0

@ user3266089 Я добавил измененную версию к моему ответу выше. Постскриптум Почему ваш XML-вход по-прежнему неверен (нет корневого элемента, ложные тире), даже после его изменения? –

Смежные вопросы