2013-12-08 2 views
0

데이터베이스에서 내보내기를 단순화하려고했지만 Muenchian 메서드와 재귀 함수를 생성하는 데 실패했습니다. 다른 속성에서 xslt가 중복됩니다.

는 내처럼 내 입력 보는 방법 :

<root> 
    <pair> 
    <master>word1</master> 
    <syns> 
     <syn>first word 1</syn> 
     <syn>second word 2</syn> 
     <syn>third word 3</syn> 
    </syns> 
    </pair> 
    <pair> 
    <master>word2</master> 
    <syns> 
     <syn>first word 1</syn> 
     <syn>fourth word 4</syn> 
    </syns> 
    </pair> 
</root> 
:

<root> 
    <pair> 
    <master>word1</master> 
    <syn>first word 1</syn> 
    </pair> 
    <pair> 
    <master>word1</master> 
    <syn>second word 2</syn> 
    </pair> 
    <pair> 
    <master>word1</master> 
    <syn>third word 3</syn> 
    </pair> 
    <pair> 
    <master>word2</master> 
    <syn>first word 1</syn> 
    </pair> 
    <pair> 
    <master>word2</master> 
    <syn>fourth word 4</syn> 
    </pair> 
</root> 

은 또한이 같은 트릭을 할 수 있습니다 : 이것이 내가 달성하고자하는 것입니다

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <Product> 
    <Values> 
     <Value AttributeID="Master">word1</Value> 
     <Value AttributeID="Syn1">first word 1</Value> 
     <Value AttributeID="Syn2">second word 2</Value> 
    </Values> 
    </Product> 
    <Product> 
    <Values> 
     <Value AttributeID="Master">word1</Value> 
     <Value AttributeID="Syn2">second word 2</Value> 
    </Values> 
    </Product> 
    <Product> 
    <Values> 
     <Value AttributeID="Master">word1</Value> 
     <Value AttributeID="Syn1">third word 3</Value> 
     <Value AttributeID="Syn2">second word 2</Value> 
    </Values> 
    </Product> 
    <Product> 
    <Values> 
     <Value AttributeID="Master">word2</Value> 
     <Value AttributeID="Syn1">first word 1</Value> 
     <Value AttributeID="Syn4">fourth word 4</Value> 
    </Values> 
    </Product> 
</root> 

그리고

기본적으로 마스터 단어와 동의어가 있습니다 (마스터 당 최대 5 개까지). 템플릿을 사용하여 중복 된 목록을 쉽게 생성 할 수 있었지만 복제본을 제거하거나 사후 처리를 위해 변수를 푸는 모든 시도에서 실패했습니다. 저를위한 문제점은 동의어가 다른 속성에있을 수 있고 항상 그들의 실제 주인을 참조 할 필요가 있었다는 것을 ...

나는 master word + any 동의어의 유일한 조합을 필요로한다 - 그리고 이상적으로 알파벳순으로 sorted

도움 주셔서 감사합니다.

답변

0

여기에 내 생각, 하나 개의 가능한 방법 :

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

<xsl:key name="syn" 
     match="Value[@AttributeID!='Master']" 
     use="concat(., '|', ../Value[@AttributeID='Master'])" /> 

<xsl:template match="/"> 
<root> 
    <xsl:for-each select="root/Product/Values/Value[@AttributeID!='Master'][generate-id()=generate-id(key('syn', concat(., '|', ../Value[@AttributeID='Master']))[1])]"> 
     <pair> 
      <master><xsl:value-of select="../Value[@AttributeID='Master']"/></master> 
      <syn><xsl:value-of select="."/></syn> 
     </pair> 
    </xsl:for-each> 
</root> 
</xsl:template> 
</xsl:stylesheet> 

정렬에 관해서는, 당신은 당신이 정렬 기준으로 사용할 않는 무슨 말을하지 않았다.

+0

대단히 감사합니다. 추가 텍스트 문제를 추가로 극복하기 위해 normalize-space() 및 lower-case() 함수를 키와 두 번째 generate-id에 추가해야했습니다. 그리고 정렬 마스터와 syn하지만 그건 쉽게 추가 할 수 있었다 :) – user3079236