2013-04-15 9 views
0

제 질문은 this one과 유사합니다.이 질문에서 필자는 요소 집합의 최소 애트리뷰트를 찾는 방법을 묻습니다. 나는 xpath에서 초보자이며 그 대답을 받아 내 XSLT에 추가하는 데 문제가 있습니다. 나는 계획 (아래 참조)의 최소 가격을 찾아 최소한을 포함하는 하위 구분에 속성을 추가해야합니다.XPATH를 사용하여 최소 애트리뷰트 요소를 계산하고 다른 애트리뷰트에 추가하십시오.

<Subdivision Status="Active"> 
    <SubdivisionName>Chesla</SubdivisionName> 
    <Plan Type="SingleFamily"> 
    <PlanNumber>555</PlanNumber> 
    <PlanName>Pinewood</PlanName> 
    <BasePrice>200500.0000</BasePrice> 
    </Plan> 
    <Plan Type="MultiFamily"> 
    <PlanNumber>444</PlanNumber> 
    <PlanName>Westfield</PlanName> 
    <BasePrice>270000.0000</BasePrice> 
    </Plan> 

참고 :

나는 다음과 같은 XML 조각을 내 XML 문서에 여러 개의 세분이있을 수 있습니다. 나는 간결함을 위해서 나의 모범에서 하나를 보여주고있다.

<Subdivision Status="Active" PriceLow="200500.00"> <==== ADDED!!! 
    <SubdivisionName>Chesla</SubdivisionName> 
    <Plan Type="SingleFamily"> 
    <PlanNumber>555</PlanNumber> 
    <PlanName>Pinewood</PlanName> 
    <BasePrice>200500.00</BasePrice> 
    </Plan> 
    <Plan Type="MultiFamily"> 
    <PlanNumber>444</PlanNumber> 
    <PlanName>Westfield</PlanName> 
    <BasePrice>270000.00</BasePrice> 
    </Plan> 

내 불완전 XSL하십시오 PriceLow 속성이 세분 형제 모든 계획 최소 BasePrice 함유 세분 요소에 추가 된 것을 제외

내 최종 출력은 입력과 동일 파일은 다음과 같습니다 :

<xsl:output omit-xml-declaration="yes" indent="yes"/> 

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

<xsl:template match="Subdivision"> 
    ... something goes here ... 
</xsl:template> 

누군가이 XSLT 파일을 완성하도록 도와 줄 수 있습니까? XSLT에 대한 책을 몇 권 읽었지 만 그동안이 프로젝트를 곧 완료해야합니다.

건배, 브렛

답변

0

이 그것을 수행해야합니다

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

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

    <xsl:template match="Subdivision"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*" /> 
     <xsl:attribute name="PriceLow"> 
     <xsl:apply-templates select="Plan/BasePrice" mode="min"> 
      <xsl:sort select="." order="ascending" data-type="number" /> 
     </xsl:apply-templates> 
     </xsl:attribute> 

     <xsl:apply-templates select="node()" /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="node()" mode="min"> 
    <xsl:if test="position() = 1"> 
     <xsl:value-of select="."/> 
    </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

아니면 더 간결하지만, 아마도 덜 효율적인 접근 방식을 :

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

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

    <xsl:template match="Subdivision"> 
    <Subdivision PriceLow="{Plan/BasePrice[not(. > current()/Plan/BasePrice)]}"> 
     <xsl:apply-templates select="@*[name() != 'PriceLow'] | node()" /> 
    </Subdivision> 
    </xsl:template> 
</xsl:stylesheet> 

이 중 하나는이 실행되면 샘플 데이터 :

<root> 
    <Subdivision Status="Active"> 
    <SubdivisionName>Chesla</SubdivisionName> 
    <Plan Type="SingleFamily"> 
     <PlanNumber>555</PlanNumber> 
     <PlanName>Pinewood</PlanName> 
     <BasePrice>200500.0000</BasePrice> 
    </Plan> 
    <Plan Type="MultiFamily"> 
     <PlanNumber>444</PlanNumber> 
     <PlanName>Westfield</PlanName> 
     <BasePrice>270000.0000</BasePrice> 
    </Plan> 
    </Subdivision> 

    <Subdivision Status="Active"> 
    <SubdivisionName>Newhaven</SubdivisionName> 
    <Plan Type="SingleFamily"> 
     <PlanNumber>555</PlanNumber> 
     <PlanName>Pinewood</PlanName> 
     <BasePrice>200900.0000</BasePrice> 
    </Plan> 
    <Plan Type="MultiFamily"> 
     <PlanNumber>444</PlanNumber> 
     <PlanName>Westfield</PlanName> 
     <BasePrice>200100.0000</BasePrice> 
    </Plan> 
    <Plan Type="QuadrupleFamily"> 
     <PlanNumber>111</PlanNumber> 
     <PlanName>Pinewood</PlanName> 
     <BasePrice>200050.0000</BasePrice> 
    </Plan> 
    <Plan Type="QuintupleFamily"> 
     <PlanNumber>222</PlanNumber> 
     <PlanName>Pinewood</PlanName> 
     <BasePrice>200300.0000</BasePrice> 
    </Plan> 
    </Subdivision> 
</root> 

결과 :

<root> 
    <Subdivision Status="Active" PriceLow="200500.0000"> 
    <SubdivisionName>Chesla</SubdivisionName> 
    <Plan Type="SingleFamily"> 
     <PlanNumber>555</PlanNumber> 
     <PlanName>Pinewood</PlanName> 
     <BasePrice>200500.0000</BasePrice> 
    </Plan> 
    <Plan Type="MultiFamily"> 
     <PlanNumber>444</PlanNumber> 
     <PlanName>Westfield</PlanName> 
     <BasePrice>270000.0000</BasePrice> 
    </Plan> 
    </Subdivision> 

    <Subdivision Status="Active" PriceLow="200050.0000"> 
    <SubdivisionName>Newhaven</SubdivisionName> 
    <Plan Type="SingleFamily"> 
     <PlanNumber>555</PlanNumber> 
     <PlanName>Pinewood</PlanName> 
     <BasePrice>200900.0000</BasePrice> 
    </Plan> 
    <Plan Type="MultiFamily"> 
     <PlanNumber>444</PlanNumber> 
     <PlanName>Westfield</PlanName> 
     <BasePrice>200100.0000</BasePrice> 
    </Plan> 
    <Plan Type="QuadrupleFamily"> 
     <PlanNumber>111</PlanNumber> 
     <PlanName>Pinewood</PlanName> 
     <BasePrice>200050.0000</BasePrice> 
    </Plan> 
    <Plan Type="QuintupleFamily"> 
     <PlanNumber>222</PlanNumber> 
     <PlanName>Pinewood</PlanName> 
     <BasePrice>200300.0000</BasePrice> 
    </Plan> 
    </Subdivision> 
</root> 
+0

멋진! 나는 대단히 감사한다. :-) – clone45