2013-04-12 3 views
4

Я пытаюсь изменить ets4_import из calimero, чтобы соответствовать старым проектам ETS4 и новым.Преобразование XML - шаблон XSL соответствует нескольким условиям

Можно ли изменить

<xsl:template match="/" xmlns:b="http://knx.org/xml/project/11"> 

к чему-то вроде

<xsl:template match="/" xmlns:b="http://knx.org/xml/project/11 or http://knx.org/xml/project/10"> 

файл XML либо начиная с

<?xml version="1.0" encoding="utf-8"?> 
<KNX xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" CreatedBy="ETS4" ToolVersion="ETS 4.0.3 (Build 3250)" xmlns="http://knx.org/xml/project/11"> 

или

<?xml version="1.0"?> 
<KNX xmlns="http://knx.org/xml/project/10" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" CreatedBy="ETS4" ToolVersion="4.0.1387.12605"> 

Here - это полный файл XSL.

Может кто-нибудь мне помочь?

Благодаря

UPDATE

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:b10="http://knx.org/xml/project/10" xmlns:b="http://knx.org/xml/project/11" > 
    <xsl:output method="xml" version="1.0" encoding="iso-8859-1" indent="yes"/> 
    <xsl:template match="/"> 
     <xsl:for-each select="b:KNX/b:Project/b:Installations/b:Installation/b:Topology"> 
      <datapoints> 
      <xsl:for-each select="b:Area/b:Line/b:DeviceInstance/b:ComObjectInstanceRefs/b:ComObjectInstanceRef"> 
       <xsl:sort select="b:Connectors/b:Send/@GroupAddressRefId"/> 
       <xsl:if test="not(preceding::b:Connectors/b:Send/@GroupAddressRefId = current()/b:Connectors/b:Send/@GroupAddressRefId)"> 
        <xsl:for-each select="b:Connectors"> 
         <xsl:variable name="verz" select="document(concat(substring(../@RefId,0,7),'/',substring-before(../@RefId, '_O'), '.xml'))/b:KNX/b:ManufacturerData/b:Manufacturer/b:ApplicationPrograms/b:ApplicationProgram/b:Static/b:ComObjectTable/b:ComObject[@Id = ../../b:ComObjectRefs/b:ComObjectRef[@Id = current()/../@RefId]/@RefId]" /> 
         <xsl:variable name="grosse"> 

Есть ли возможность определить

b: = b: | b10: 

так, что я не должен изменить весь файл

ответ

0

С помощью XSLT 2.0 вы можете сначала изменить (или хотя бы полосу) пространство имен документа, а затем применить имеющийся у вас гигантский шаблон. В XSLT 1.0 вы можете заменить все вхождения b:XYZ на *[local-name()='XYZ'].

3

Я думаю, что вы ищете это:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:b10="http://knx.org/xml/project/10" xmlns:b11="http://knx.org/xml/project/11"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="b10:MyElement|b11:Element"> 
     <!-- Template code... --> 
    </xsl:template> 
</xsl:stylesheet> 

хотя, так как вы соответствие корневой элемент, и вы только преобразовывать один XML-документ, в то время, я не совсем понимаю проблему, потому что / будет соответствовать корневому элементу в любом случае.

+0

Возможно, я делаю что-то неправильно, но после совпадения шаблона у меня есть select = "b: KNX/b: Project ...", который больше не работает. Если у меня есть выбор = "b11: KNX/b11: Project ...", он работает, но я хочу использовать обе версии. – mickeyrourkeske

+0

Тогда, возможно, вам понадобится b10: KNX/b10: Project | b11: KNX/b11: Project, но, конечно, мне нужен небольшой, но полный (не псевдо) пример вашего входного XML, ваш ожидаемый вывод и результат, который вы в настоящее время имеете. – Dabbler

Смежные вопросы