Использование параметра xsl (если существует) для воспроизведения значения атрибута - PullRequest
1 голос
/ 12 мая 2010

Я бы хотел xsl, который заменяет атрибут value элементов данных, только если переданы соответствующие имена param (они переданы из вызывающей Java-программы).

Ввод

<applicationVariables applicationServer="tomcat">
    <data name="HOST" value="localhost"/>
    <data name="PORT" value="8080"/>
    <data name="SIZE" value="1000"/>
</applicationVariables>

Так, например, если передать параметр HOST1 = myHost и PORT = 9080, вывод должен быть:

<applicationVariables applicationServer="tomcat">
    <data name="HOST" value="myHost"/>
    <data name="PORT" value="9080"/>
    <data name="SIZE" value="1000"/>
</applicationVariables>

Обратите внимание, что HOST и PORT были заменены, но размер не был заменен, поскольку не было параметра с именем SIZE

Мне не нужна проверка для каждого имени, как показано ниже:

<xsl:when test="not($HOST)"> <!-- parameter has not been supplied -->
    <xsl:attribute name="value"><xsl:value-of select="@value"/></xsl:attribute>
</xsl:when>
<xsl:otherwise> <!--parameter has been supplied -->
    <xsl:attribute name="value"><xsl:value-of select="$HOST"/></xsl:attribute>
</xsl:otherwise>

Мне нужен общий способ сказать: заменять атрибут значения только в том случае, если существует параметр с тем же именем. Но как мне проверить, существует ли параметр с именем = @name?

Ответы [ 2 ]

0 голосов
/ 12 мая 2010

В этом случае гораздо лучше передать все параметры как элементы одного <xsl:param>:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:param name="pParams">
  <p name="HOST">myHost</p>
  <p name="PORT">9080</p>
 </xsl:param>

 <xsl:variable name="vParams" select=
   "document('')/*/xsl:param[@name='pParams']/*"/>

 <xsl:template match="node()|@*" name="identity">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="@value">
  <xsl:attribute name="value">
    <xsl:value-of select=
      "$vParams[@name=current()/../@name]
      |
       current()[not($vParams[@name=current()/../@name])]
      "/>
  </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному документу XML:

<applicationVariables applicationServer="tomcat">
    <data name="HOST" value="localhost"/>
    <data name="PORT" value="8080"/>
    <data name="SIZE" value="1000"/>
</applicationVariables>

желаемый, правильный результат получается :

<applicationVariables applicationServer="tomcat">
    <data name="HOST" value="myHost"></data>
    <data name="PORT" value="9080"></data>
    <data name="SIZE" value="1000"></data>
</applicationVariables>
0 голосов
/ 12 мая 2010

Вы можете комбинировать логические условия с xsl: if .

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