2013-04-24 1 views
1

한 메시지에서 다른 메시지로 변환하는 간단한 xslt를 작성했는데 역으로 자동 생성 할 수있는 방법이 있습니까?자동으로 xsl을 반대로합니다.

원래 XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
     <xsl:template match="/"> 
     <hello> 
     <xsl:for-each select="/hello/greeting">   
     <H1> 
       <xsl:value-of select="."/> 
     </H1> 
     </xsl:for-each> 
     </hello> 
     </xsl:template> 
    </xsl:stylesheet> 

원하는 XSLT

난 당신이 물건의 대부분을 다시 사용할 수 있습니다, 자동으로 반대 방향으로

하나를 생성 할 수있는 방법이 있다고 생각하지 않지만

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
    <hello> 
    <xsl:for-each select="/hello/H1">   
     <greeting> 
      <xsl:value-of select="."/> 
     </greeting> 
    </xsl:for-each> 
    </hello> 
    </xsl:template> 
</xsl:stylesheet> 
+1

SQL Server에서이 작업을 수행하는 방법을 알고 있습니까? 읽기 : 트랜잭션, 트랜잭션 로그, 트랜잭션 실행 취소/중단. 트랜잭션 시스템에서 트랜잭션을 트랜잭션으로 만듭니다. –

+0

불행히도 귀하의 도움을 주셔서 감사합니다,이 내 문제를 해결하려면 실제 xsls 반전하고자 훨씬 더 큰 있으며 산업 CDM을 엔터프라이즈 CDM 매핑 할 것 같지 않습니다. 나는 누군가가 이것을 할 수있는 멋진 도구를 알고 있기를 정말로 바라고 있었다. – user2313879

+1

user2313879, 사람들은 일반적인 경우 변환을 되돌릴 수 없다고 설명했습니다. * - 더 이상 무엇을 원하십니까? 함수와 마찬가지로 작은 클래스의 함수 만이 되돌릴 수 있습니다. 다른 인수로 호출 할 때 값이 다른 함수입니다. 대부분의 함수 *에는이 속성이 없습니다. 변환은 소스 XML 문서 및 제공된 전역 매개 변수뿐 아니라 전역 컨텍스트의 함수입니다. –

답변

2

아니오, XSLT를 역전시키는 일반적인 방법은 없습니다. 사실, 나는 대부분의 XSLT가 되돌릴 수 없다고 말하고 싶다. 이는 그러나, 파라미터 값을 변경하여 순방향 또는 역방향으로 실행할 수 있도록 위의 예를 설계 할 수있다 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:exslt="http://exslt.org/common"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:param name="direction" select="'forward'" /> 

    <xsl:variable name="mappingNF"> 
    <map from="greeting" to="H1" /> 
    <map from="pleasantry" to="H2" /> 
    </xsl:variable> 
    <xsl:variable name="mapping" select="exslt:node-set($mappingNF)" /> 

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

    <xsl:template match="*" mode="copy"> 
    <xsl:call-template name="Copy" /> 
    </xsl:template> 

    <xsl:template match="*"> 
    <xsl:variable name="mappingItem" 
        select="$mapping/*[$direction = 'forward' and @from = local-name(current()) or 
           $direction = 'reverse' and @to = local-name(current())]" /> 

    <xsl:apply-templates select="current()[$mappingItem]" mode="rename"> 
     <xsl:with-param name="mappingItem" select="$mappingItem" /> 
    </xsl:apply-templates> 
    <xsl:apply-templates select="current()[not($mappingItem)]" mode="copy" /> 
    </xsl:template> 

    <xsl:template match="*" mode="rename"> 
    <xsl:param name="mappingItem" /> 

    <xsl:element name="{$mappingItem/@to[$direction = 'forward'] | 
         $mappingItem/@from[$direction = 'reverse']}"> 
     <xsl:apply-templates select ="@* | node()" /> 
    </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

mappingNF 노드 이름의 대응 관계를 나타내며, 이는 일 수 필요에 따라 많은 map을 추가합니다. 변환 방향은 direction 매개 변수의 값을 "forward"와 "reverse"사이에서 변경하여 앞뒤로 전환 할 수 있습니다.

0

현재 템플릿에서 템플릿이 동일한 경우

예일 것입니다.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
    <hello> 
    <xsl:for-each select="/hello/H1 | /hello/greeting">  
    <H1> 
      <xsl:value-of select="."/> 
    </H1> 
    </xsl:for-each> 
    </hello> 
    </xsl:template> 
</xsl:stylesheet> 
1

아마도 컴퓨터 과학 학생이 뒤집을 수있는 XSLT 변환 클래스가 있는지 여부를 식별하는 흥미로운 연습이있을 것입니다. 이것은 물론 변형이 무손실이어야한다는 것을 의미합니다. 가장 확실한 후보는 요소의 이름을 바꾸는 것 외에는 아무 일도하지 않는 변환이지만, 심지어 스타일 시트가 두 개의 다른 입력 이름을 다음에 매핑하지 않는다는 것을 증명하는 것이 소스 문서 어휘 및 구조에 대한 지식 없이는 매우 어려울 것이라고 생각합니다. 동일한 출력 이름. 그래서 나는 그것이 결국 작은 세트가 될 것이라고 생각합니다.

실용적으로 실제로는 HTML 헤더와 같은 중복 정보를 추가하는 변환과 두 입력 요소가 동일한 출력 요소에 매핑되지만 다른 속성 (예 : div class = X "여기서 X는 입력 요소 이름이 재구성되도록합니다).