XSL을 사용하여 속성이 다른 값을 갖는 것을 제외하고는 동일한 세 개의 XML 문서를 읽습니다 (잠재적으로 많은 XML 파일을 읽을 것입니다). "testName"속성이 "TestOne"인 요소에 대해 "결과"속성의 값이 "통과"또는 "실패"인 횟수를 계산하고 싶습니다. 다음을 사용하여 이것을 달성하고 있습니다.
File1.xml
<container>
<build>
<Tests>
<Results>
<Result testName="TestOne" outcome="Passed" ></Result>
<Result testName="TestTwo" outcome="Passed" ></Result>
</Results>
</Tests>
</build>
</container>
File2.xml
<container>
<build>
<Tests>
<Results>
<Result testName="TestOne" outcome="Passed" ></Result>
<Result testName="TestTwo" outcome="Failed" ></Result>
</Results>
</Tests>
</build>
</container>
File3.xml
<container>
<build>
<Tests>
<Results>
<Result testName="TestOne" outcome="Failed" ></Result>
<Result testName="TestTwo" outcome="Failed" ></Result>
</Results>
</Tests>
</build>
</container>
Index.xml
<?xml-stylesheet type="text/xsl" href="merge3.xsl"?>
<list>
<entry name="File1.xml" />
<entry name="File2.xml" />
<entry name="File3.xml" />
</list>
Merge2.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
<xsl:for-each select="/list/entry">
<xsl:apply-templates select="document(@name)/container/build/*[local-name()='Tests']" />
</xsl:for-each>
</xsl:template>
<xsl:template match="*[local-name()='Results']">
<xsl:variable name="name" select="'TestOne'" />
<xsl:variable name="totalPassed" select="*[local-name()='Result'][@testName = 'TestOne'][@outcome = 'Passed']" />
<xsl:variable name="totalFailed" select="*[local-name()='Result'][@testName = 'TestOne'][@outcome = 'Failed']" />
<h2>Totals</h2>
<table border="1" cellSpacing="0" cellPadding="5" >
<tr bgcolor="#9acd32">
<th>Test Name</th>
<th>Total Passed</th>
<th>Total Failed</th>
</tr>
<tr>
<td><xsl:value-of select="$name"/></td>
<td><xsl:value-of select="count($totalPassed)"/></td>
<td><xsl:value-of select="count($totalFailed)"/></td>
</tr>
</table>
</xsl:template>
</xsl:stylesheet>
결과는 3 개의 합계 테이블을 생성합니다. 내 의도는 모든 XML 문서에서 TestOne이 통과 및 실패한 횟수를 표시하는 하나의 Totals 테이블을 표시하는 것입니다. 각 XML 문서를 읽고 / 선택한 다음 한 번에 하나씩 처리하는 것 같습니다. 처리하기 전에 모든 XML 파일을 읽고 선택하고 싶습니다.
당신은 수집 할 수 있는 모든Result
같은 것을 사용하여 세 가지 문서 전역에서 요소를
<xsl:variable name="allResults"
select="(/ | document('file2.xml') | document('file3.xml'))//Result" />
그런 다음 여기에 술어를 적용하여 관심있는 요소를 계산합니다. 예를 들어
<xsl:value-of select="
count($allResults[@testName = 'TestOne'][@outcome = 'Failed'])" />
고정 된 파일 이름 세트 대신 index.xml
결합하려는 모든 파일을 나열 하는 기본 파일 이있는 경우 , 예를 들면 다음과 같습니다.
<list>
<entry name="File1.xml" />
<entry name="File2.xml" />
<entry name="File3.xml" />
</list>
그런 다음이 색인을 스타일 시트의 기본 입력으로 사용할 수 있으며 allResults
변수는 다음 과 같습니다.
<xsl:variable name="allResults"
select="document(/list/entry/@name)//Result" />
노드 집합을 document
함수에 전달하면 각 노드의 문자열 값을 차례로 받아로드 할 파일의 URI로 처리하여 결과 문서 루트 노드 집합 을 반환합니다 .
여기에 완전한 예가 있습니다.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:variable name="allResults"
select="document(/list/entry/@name)//Result" />
<xsl:template match="/">
<xsl:variable name="name" select="'TestOne'" />
<h2>Totals</h2>
<table border="1" cellSpacing="0" cellPadding="5" >
<tr bgcolor="#9acd32">
<th>Test Name</th>
<th>Total Passed</th>
<th>Total Failed</th>
</tr>
<tr>
<td><xsl:value-of select="$name"/></td>
<td><xsl:value-of select="count($allResults[@testName = $name]
[@outcome = 'Passed'])"/></td>
<td><xsl:value-of select="count($allResults[@testName = $name]
[@outcome = 'Failed'])"/></td>
</tr>
</table>
</xsl:template>
</xsl:stylesheet>
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다