Логика для передачи переменного числа параметров в XSLT - PullRequest
0 голосов
/ 16 декабря 2011

Мне нужно разработать приложение, которое будет периодически проверять данные из XML-канала, обрабатывать их и предпринимать соответствующие действия, такие как уведомление пользователей и т. Д., Но в основном используется для создания и просмотра отчета.Этот xml-канал в основном проверяет время безотказной работы, время простоя приложений.

Вот следующие шаги, которые я выполняю:

  1. Я загружаю XML-файл из удаленного местоположения на свой сервер,
  2. Проверьте, какие приложения следует отслеживать из файла свойств.
  3. Преобразование его в html с использованием XSLT и отправка html-страницы по почте.

Теперь этот XML-канал также содержит приложения, которые не нужно отслеживать, и проверяется с помощью файла свойств в java.Отслеживаемое приложение может быть добавлено позже.

Так есть ли способ включить это в файл xsl?(Я могу также передавать параметры из java в xslt, но количество параметров будет переменным. Я группирую имена приложений и передаю их с использованием двух параметров, но застрял, потому что эти значения нельзя сравнивать с помощью итератора xsl:for-eachФайл фида XML.)

РЕДАКТИРОВАТЬ:

<begin last-update="12/16/2011 06:18:31 am">
    <application id="1" name="xyz" last-update="12/16/2011 6:16:03 AM">
        <node2 code="normal">
            <childnodes></childnodes>
            <childnodes></childnodes>
        </node2>

    </application>
    <application id="2" name="abc" last-update="12/14/2011 6:16:03 AM">
        ... Same as before
</application>
</begin>

Это фид XML.я перебираю этот xml .. мне нужно проверить атрибут имени в узле приложения .. ниже приведен код xsl

<xsl:for-each select="begin/application">
<!-- Need this to be fetched dynamically using xsl params -->
<xsl:if test="@name='abc' or @name=xyz' >
<tr width="100%" style="border:solid 1px black;">
<td  style="text-align:center; vertical-align:center;">DATA</td>
<td  style="text-align:center; vertical-align:center;">DATA</td>
<td  style="text-align:center; vertical-align:center;">DATA</td>
</tr>
</xsl:if>

В настоящее время атрибуты имени жестко закодированы .. мне нужночтобы использовать их из списка параметров, переданного из кода Java - строка параметров: app1, app2 и параметры в узле, заданные как

<root>
<application @name="ABC"></application>
<application @name="XYZ"></application>
</root>

Вопрос в том, как выполнить итерацию поparams, так как мне также потребуется итерация для файла xml.

Ответы [ 3 ]

1 голос
/ 16 декабря 2011

Способ передачи «нескольких параметров» в преобразование заключается в передаче одного параметра, то есть элемента (дерева) XML, чьи дочерние элементы будут обрабатываться и обрабатываться как фактические (логические) параметры преобразования.

Передайте что-то вроде этого:

<params>
 <param name="p1"> some subtree/<param>

.  .  .  .  

 <param name="pk"> some subtree/<param>
<params>
1 голос
/ 16 декабря 2011

Почему бы вам не использовать JAXB, чтобы предоставить вам представление данных XML на Java. Затем вы можете обойти данные в своем Java-коде, используя файл свойств (или любой другой, который может заменить ваш файл свойств в будущем, например, таблицу базы данных), а затем просто создать вывод HTML с JSP / Velocity / <insert favourite view tech here>

Вероятно, это будет более гибкий дизайн, чем попытка вставить все в XSL

0 голосов
/ 20 декабря 2011

Хорошо, я смог это сделать. Вместо передачи параметров я создал файл XML и с помощью функции документа прочитал этот файл в шаблоне. Этот шаблон был вызван внутри для каждого основного документа. Здесь я передал параметры в шаблон, перебрал файл XML и сделал все, что должен был сделать.

Хм, в случае, если кто-то застрянет в такой глупой ситуации, как я, где он не продумал, прежде чем тратить значительное количество времени. JAXB - лучший способ пройти. Я реализовал решение JAXB, и оно довольно простое. Но поскольку xslt в настоящее время удовлетворяет моим требованиям, я использую XSLT.

XSLT код:

<xsl:for-each select="begin/application">
<xsl:call-template name="doSome">
    <xsl:with-param name="appname" select="@name" />
</xsl:call-template>
<xsl:template name="doSome">
    <xsl:param name="appname" />
    <xsl:for-each select="document('file:///E:/LOG/list.xml')/root/application">
        <xsl:if test="@name=$appname">                  
            ... do whatever you want to do
        </xsl:if>
     </xsl:for-each>
</xsl:template>
...