2014-10-29 2 views
1

내 xslt 코드의 문제에 대한 도움이 필요합니다. 사용 된 프로세서/디버거 & IDE : (. 단지 난 내 선택에 필요한 요소를 아래로 시끄러운 쓰레기 오토바이) MSXML 6.0 MS Visual Studio에서 2012 년XSLT 1.0 고유 값 가져 오기 실패

내 정확한 입력

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <components> 
    <Object3D id="130" plName="STF45668"/> 
    <Object3D id="131" plName="RIOD122"/> 
    <Object3D id="132" plName="RIOD122"/> 
    <Object3D id="133" plName="RIOD122"/> 
    <Object3D id="182" plName="RIOD124"/> 
    <Object3D id="183" plName="RIOD124"/> 
    <Object3D id="184" plName="RIOD124"/> 
    <Object3D id="185" plName="RIOD124"/> 
    </components> 
</root> 

내 XSLT :

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt"> 
    <xsl:key name ="objectsByName" use="/root/components/Object3D" match="@plName"/> 
    <xsl:output media-type="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/"> 
    <xsl:variable name="allObjs" select="//Object3D"/> 
    <xsl:variable name="distinctObjsCount" 
        select="//Object3D[count(. | key('objectsByName', @plName)[1]) = 1]"/> 
    <xsl:variable name="distinctObjsGenID" 
        select="//Object3D[generate-id() = 
          generate-id(key('objectsByName', @plName)[1])]"/> 

    <xsl:for-each select="//Object3D[count(. | key('objectsByName', @plName)[1]) = 1]"> 
     <xsl:value-of select="concat(@plName, '(',count(key('objectsByName', @plName)),')')"/> 
     <xsl:if test="position() != last()">, </xsl:if> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 
는 변환 출력 내가 얻을이다

<?xml version="1.0" encoding="utf-8"?> 
STF45668(0), RIOD122(0), RIOD122(0), RIOD122(0), RIOD124(0), RIOD124(0), RIOD124(0), RIOD124(0) 

하지만 Object3D 요소에서 고유 한 값을 가져 오는 데 실패합니다.

그래서 ... 왜 이것이 잘못 될지 잘 모르겠습니다. 누구나 내가 뭘 잘못하고 있는지 알 수 있습니까?

편집 : 현재 사용중인 파일에 1 : 1.

+0

문제를 재현 할 수 있도록 전체 XSLT 스타일 시트를 보여주십시오. 또한 완전한 XML 입력이 도움이 될 것입니다. 감사! –

+0

나는 당신이 정말로 그것을 원한다고 생각하지 않는다. 실제 입력 파일에는 약 5k 줄의 프로그램 생성 XML 코드가 있고 xsl 파일에는 약 4k 줄이 있습니다. 그것은 premade 템플릿에서 .odt 파일을 생성하기 때문에> 거대한 오버 헤드입니다. 내가 할 수있는 일은 영향받은 요소와 관련된 모든 속성을 추가하는 것입니다. –

+0

나는 당신이 가지고있는 모든 것의 10k 덤프를 요구하지 않았다. 그러나 사람들이 실수/불일치/놀라운 결과를 추적하기를 원한다면 모든 것을 게시하거나 b) 입력 및 코드의 작은 하위 집합에서이 문제를 격리해야합니다. 그렇지 않으면 모든 배팅이 해제됩니다. –

답변

3

입력 내용이 저에게 맞지 않습니다. , XSLT를 다음은이 XML로 잘 작동합니다

<root> 
<components> 
    <Object3D plName="chair" /> 
    <Object3D plName="cup" /> 
    <Object3D plName="desk" /> 
    <Object3D plName="cup" /> 
    <Object3D plName="chair" /> 
    <Object3D plName="chair" /> 
    <Object3D plName="desk" /> 
    <Object3D plName="cup" /> 
</components> 
</root> 

: 그리고 적절한 입력 XML 뭔가 같은 것

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 
<xsl:key name="Object" match="Object3D" use="@plName"/> 

<xsl:template match="/root/components"> 
    <xsl:for-each select="Object3D[count(. | key('Object', @plName)[1]) = 1]"> 
     <xsl:value-of select="concat(@plName, '(',count(key('Object', @plName)),')')"/> 
     <xsl:if test="position() != last()">, </xsl:if> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

키가 그룹 Object3D에 사용하고,를위한 각각의 내부에있다,

chair(3), cup(3), desk(2) 
+0

그건 내 문제의 재미있는 부분입니다. 이 선택은 입력 파일의 모든 Object3D 요소를 반환합니다. 그룹화가 제대로 작동하지 않습니다. 위 코드의 결과는 다음과 같습니다. 의자 (0), 의자 (0), 의자 (0), 컵 (0), 컵 (0), 컵 (0), 책상 (0), 책상 0) 나를 믿어 라, 나는 결과에도 놀랐다. –

+0

+1에 대한 XSLT 코드 –

+1

@ steven.eisenreich 아니오, 그건 사실이 아닙니다. 적어도 Saxon에서는 설명대로 정확하게 작동합니다. 어떤 프로세서를 사용하고 있습니까? –