2016-06-19 3 views
0

간단한 테이블을 xml 요소로 변환하는 것에 관심이 있습니다. 이 테이블은 속성에 대한 단순한 이름 값인 두 행으로 시작하지만 테스트 집합에 대한 속성이 포함되어 있습니다. 나는 각 테스트가 일련의 속성을 가진 XML 요소가되기를 바라고있다. 이것에 대한 간단한 접근법이있을 것이라고 확신하지만 올바른 접근 방식을 생각하는 데 어려움을 겪고 있습니다. 입력은 다음과 같습니다테이블을 XML로 변환하기

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<table border="1"> 
    <tr> 
     <td>Property Heading</td> 
     <td>Value Heading</td> 
    </tr> 
    <tr> 
     <td>Property1</td> 
     <td>Value 1</td> 
    </tr> 
    <tr> 
     <td>Property2</td> 
     <td>Value 2</td> 
    </tr> 
    <tr> 
     <td>test1</td> 
     <td>Property t1.1</td> 
     <td>Value t1.1</td> 
    </tr> 
    <tr> 
     <td/> 
     <td>Property t1.2</td> 
     <td>Value t1.2</td> 
    </tr> 
    <tr> 
     <td/> 
     <td>Property t1.3</td> 
     <td>Value t1.3</td> 
    </tr> 
    <tr> 
     <td>test2</td> 
     <td>Property t2.1</td> 
     <td>Value t2.1</td> 
    </tr> 
    <tr> 
     <td/> 
     <td>Property t2.2</td> 
     <td>Value t2.2</td> 
    </tr> 
</table> 

원하는 출력은 내가 여러 가지 방법을 시도

<table> 
    <Property1>Value 1</Property1> 
    <Property2>Value 2</Property2> 
    <test> 
     <Property_t1.1>Value t1.1</Property_t1.1> 
     <Property_t1.2>Value t1.2</Property_t1.2> 
     <Property_t1.3>Value t1.3</Property_t1.3> 
    </test> 
    <test> 
     <Property_t2.1>Value t2.1</Property_t2.1> 
     <Property_t2.2>Value t2.2</Property_t2.2> 
    </test> 
</table> 

이지만, 아무도 작업을 아주 잘. 올바른 방향으로 솔루션이나 포인터를 기대하고 있습니다. 이 같은

+0

그것은 예에서 논리를 추론하기는 어렵습니다. 규칙을 말로 설명하십시오. –

+0

우리는 적합성 클래스를 설명하는 테이블을 가지고 있습니다. 속성 1과 속성 2는 적합성 클래스의 속성입니다. 여러 속성이있을 수 있습니다. 적합성 클래스에는 또한 몇 가지 속성이있는 테스트가 있습니다. 각 테스트는 자체적으로 하나의 클래스 여야합니다. 실제 예제에서 Word XML 파일에서 XML로 추출하여 단순한 html 디스플레이로 변환 할 수 있도록 노력하고 있습니다. –

+0

이들은 * 규칙 *이 아닙니다. 나는 당신의 모범에서 상수가 무엇인지 그리고 단지 모범이 무엇인지 알 수 없다. 예상 출력 *에 수동으로 도달하는 방법을 단계별로 설명하십시오. 왜 부동산 t1.3/가치 t1.3이 산출에서 제외 되었습니까? michael.hor257k @ –

답변

0

뭔가 :

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

    <xsl:template match="/table"> 
    <xsl:copy> 
     <xsl:element name="{tr[2]/td[1]}"> 
     <xsl:value-of select="tr[2]/td[2]"/> 
     </xsl:element> 
     <xsl:element name="{tr[3]/td[1]}"> 
     <xsl:value-of select="tr[3]/td[2]"/> 
     </xsl:element> 
     <xsl:apply-templates select="tr[position() > 3][td[1] != '']"/> 

    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="tr"> 
    <test> 
     <xsl:element name="{translate(td[2], ' ', '_')}"> 
     <xsl:value-of select="td[3]"/> 
     </xsl:element> 
     <xsl:for-each select="following-sibling::tr[td[1] = '' and preceding-sibling::tr[td[1] != ''][1] = current()]"> 
     <xsl:element name="{translate(td[2], ' ', '_')}"> 
      <xsl:value-of select="td[3]"/> 
     </xsl:element> 
     </xsl:for-each> 
    </test> 
    </xsl:template> 

</xsl:stylesheet> 
+0

이 답변에는 유용한 아이디어가 있지만 매우 구체적으로 보입니다. 그것을 일반화 할 방법이 있습니까? –

+0

"올바른 방향으로의 포인터"를 찾고있었습니다. 그러면 다음 질문으로 다시 시도해보십시오. –

+0

@ TedHabermann, 이것은 질문 한 질문에 대한 답변입니다. –

관련 문제