Как добавить сложную структуру в несколько мест в файле XML - PullRequest
3 голосов
/ 30 марта 2010

У меня есть XML-файл, в котором есть много разделов, как показано ниже:

<Operations>
  <Action [some attributes ...]>
    [some complex content ...]
  </Action>
  <Action [some attributes ...]>
    [some complex content ...]
  </Action>
</Operations>

Я должен добавить <Action/> к каждому <Operations/>. Кажется, что XSLT должен быть хорошим решением этой проблемы:

<xsl:template match="Operations/Action[last()]">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
  <Action>[some complex content ...]</Action>
</xsl:template>

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

Моя проблема в том, что содержимое моего <Action/> содержит некоторые выражения xPath. Например:

<Action code="p_histo01">
  <customScript languageCode="gel">
    <gel:script
          xmlns:core="jelly:core"
          xmlns:gel="jelly:com.niku.union.gel.GELTagLibrary"
          xmlns:soap="jelly:com.niku.union.gel.SOAPTagLibrary"
          xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"
          xmlns:sql="jelly:sql"
          xmlns:x="jelly:xml"
          xmlns:xog="http://www.niku.com/xog"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <sql:param value="${gel_stepInstanceId}"/>
    </gel:script>
  </customScript>
</Action>

${gel_stepInstanceId} интерпретируется моим XSLT, но я бы хотел, чтобы он был скопирован как есть. Это возможно? Как?

Ответы [ 3 ]

4 голосов
/ 31 марта 2010

Спецификация XSLT 1.0 (а также 2.0) определяет строгий способ экранирования фигурных скобок внутри значения атрибута , чтобы они не использовались для обозначения начала / конца AVT.

Цитировать из спецификации:

Когда шаблон значения атрибута экземпляр, двойной слева или справа фигурная скобка вне выражения воли быть заменены одной фигурной скобкой.

Используйте

  <sql:param value="${{gel_stepInstanceId}}"/>
1 голос
/ 30 марта 2010

Я обнаружил, что могу использовать:

<xsl:text disable-output-escaping="yes">
  <[CDATA[
    <Action>[...]</Action>
  ]]>
</xsl:text>

Мне проще, чем заменить все экземпляры $ {} ...

Это решение работает для меня, запустив мой XSLT с XMLSpy, но найденная мною документация позволяет мне думать, что «disable-output-escaping» не рекомендуется ... Используйте на свой страх и риск ...

0 голосов
/ 30 марта 2010

Конечно, это достаточно просто:

<sql:param value="{'${gel_stepInstanceId}'}"/>

Фигурные скобки имеют синтаксис "шаблон значения атрибута" (AVT). В XSLT не определено экранирования строк, поэтому вам нужно обойти это - проще всего, определив фактический AVT и передав ему строковое значение для отображения.

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