Выполнить XSLT-преобразование из Java с параметром - PullRequest
5 голосов
/ 07 октября 2011

Я выполняю XSLT-преобразование из моего веб-приложения Java без проблем, как показано ниже:

Transformer transformer = TransformerFactory.newInstance().newTransformer(xslSource);
transformer.transform(xmlInput, xmlOutput);

В моем XSLT-преобразовании я добавляю вызов функции document() для загрузки ответа от веб-службы RESTful:

<!-- do stuff -->
<xsl:variable name="url">
   http://server/service?id=<xsl:value-of select="@id"/>
</xsl:variable>
<xsl:call-template name="doMoreStuff">
   <xsl:with-param name="param1" select="document($url)/foo"/>
</xsl:call-template>

Хорошо, круто, нет проблем. Но теперь я хочу прочитать базовый URL из класса utils в java и передать его в таблицу стилей.

//java
String baseUrl = myUtils.getBaseUrl();

<!-- xslt -->
<xsl:variable name="url">
   <xsl:value-of select="$baseUrl"/>
   <xsl:text>/service?id=</xsl:text>
   <xsl:value-of select="@id"/>
</xsl:variable>

Есть предложения о том, как это сделать? Мой класс Java Utils загружает значение из файла myApp.properties на пути к классам, но я не уверен, что смогу использовать это из XSLT ...

Ответы [ 2 ]

7 голосов
/ 07 октября 2011

Объявите xsl:param в вашей таблице стилей, чтобы значение baseUrl могло быть передано во время вызова:

<xsl:param name="baseUrl" />

Установить параметр для объекта Transformer:

Transformer transformer = TransformerFactory.newInstance().newTransformer(xslSource);
transformer.setParameter('baseUrl', myUtils.getBaseUrl());
transformer.transform(xmlInput, xmlOutput);

Если вы используете XSLT 2.0, то вы можете рассмотреть возможность использования функции resolve-uri() при создании значения переменной url:

<xsl:variable name="url" 
              select="resolve-uri(concat('/service?id=', @id), $baseUrl)" />

resol-uri () может помочь компенсировать конечные слэши, хэштеги и другие элементы в baseUrl, которые в противном случае могли бы привести к созданию недопустимого URL-адреса путем простой конкатенации $baseUrl с фрагментом @id.

6 голосов
/ 07 октября 2011

Вызовите setParameter в вашем экземпляре Transformer, указав имя и значение вашего параметра. Затем в своем документе XSLT объявите параметр, используя <xsl:param name="yourParamName" />, и затем вы можете использовать его в своем XSLT, например, так: <xsl:value-of select="$yourParamName" />

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