Доступ к динамическим переменным в XSLT - PullRequest
1 голос
/ 23 декабря 2011

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

РЕДАКТИРОВАТЬ: Проблема реального мира - это проблема системной интеграции.Подумайте о «типовой» собственности.В системе A тип «Автомобиль» кодируется клавишей «1».В системе B (где я должен импортировать сообщение из системы A) тип «Автомобиль» кодируется ключом «X».Пример: 1 <-> Car <-> X. Поэтому, когда я отображаю сообщения из системы A в сообщения из системы B, мне нужна какая-то карта.Я хотел бы определить эту карту в одном месте (один лист XSLT) и использовать его в нескольких других листах XSLT (с помощью команды include).Что касается карты, я также хотел бы определить удобные функции доступа, такие как: getTargetKey (mapWhereTheKeyIsIn, 'sourceKey').Поэтому, когда бы мне ни пришлось отобразить сообщение из системы A в схему системы B, я бы хотел набрать: <Type><xsl:value-of select="getTargetKey(typeMap, '1')" /><Type> и получить <Type>X</Type>

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
  <xsl:output method="text" encoding="UTF-8"/>                
    <xsl:variable name="var1">
         <Entry key="1" value="ABC" />
         <Entry key="2" value="CDF" />
    </xsl:variable>
  <xsl:template match="/">   
       <xsl:value-of select="myFunc('var1', '1')" />
  </xsl:template>
            <xsl:function name="myFunc">
              <xsl:param name="variable_name"/>
              <xsl:param name="key"/>
              <xsl:value-of select="document('')/*/xsl:variable[@name=$variable_name]/Entry[@key = $key]/@value"/>
            </xsl:function>   
</xsl:stylesheet>

Пример ввода

<?xml version="1.0" encoding="UTF-8"?>
<order_system_a type="1" />

Желаемый выход

<?xml version="1.0" encoding="UTF-8"?>
<order_system_b type="X" />

1 Ответ

2 голосов
/ 24 декабря 2011

Вот запрашиваемое общее решение проблемы :

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:my="my:my" exclude-result-prefixes="my xs">
 <xsl:import href="C:/temp/delete/GlobalTypeMappings.xsl"/>
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="order_system_a">
  <order_system_b>
   <xsl:apply-templates select="@*"/>
  </order_system_b>
 </xsl:template>

 <xsl:template match="order_system_a/@type">
  <xsl:attribute name="type" select=
   "my:convertType('order_system_a', 'order_system_b', .)"/>
 </xsl:template>
</xsl:stylesheet>

C: /temp/delete/GlobalTypeMappings.xsl:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:my="my:my" exclude-result-prefixes="my xs">

 <xsl:key name="kMapFromLocal" match="map"
  use="concat(@system, '+', @local-type)"/>

 <xsl:key name="kMapFromValue" match="map"
  use="concat(@system, '+', @value)"/>

 <my:TypeMappings>
  <map system="order_system_a" local-type="1" value="type1"/>
  <map system="order_system_a" local-type="2" value="type2"/>
  <map system="order_system_a" local-type="3" value="type3"/>
  <map system="order_system_a" local-type="4" value="type4"/>

  <map system="order_system_b" local-type="X" value="type1"/>
  <map system="order_system_b" local-type="Y" value="type2"/>
  <map system="order_system_b" local-type="Z" value="type3"/>
  <map system="order_system_b" local-type="T" value="type4"/>

  <!-- Other type mappings here -->
 </my:TypeMappings>

 <xsl:function name="my:convertType" as="xs:string?">
  <xsl:param name="pfromSystem" as="xs:string"/>
  <xsl:param name="ptoSystem" as="xs:string"/>
  <xsl:param name="pfromValue" as="xs:string"/>

  <xsl:variable name="vthisDoc" select="document('')"/>

  <xsl:sequence select=
   "key('kMapFromValue',
         concat($ptoSystem,
               '+',
                key('kMapFromLocal',
                    concat($pfromSystem, '+', $pfromValue),
                    $vthisDoc
                    )
                     /@value
                ),
          $vthisDoc
        )
         /@local-type
   "/>
 </xsl:function>
</xsl:stylesheet>

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

<order_system_a type="1" />

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

<order_system_b type="X"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...