2014-01-25 2 views
0

저는이 작업을 올바르게 수행하고 있지만 경로가 엉망입니다.변수 ID를 통해 변수 ID를 통해 개체의 이름을 선택할 수 없습니다. 각주기마다 param, templates를 사용합니다.

내가하려는 것은 i5 또는 i7 프로세서가있는 XML의 모든 구성 정보를 포함하는 테이블을 작성하는 것입니다. 구성 요소의 구성 요소 ID를 가져 와서 구성 요소 ID와 components 요소. 필자는 Config_Name과 MB_Producer의 두 요소에 대해서만이 작업을 시도했습니다. Config_Name이 성공적으로 표시되었지만 마더 보드의 이름을 얻지 못했습니다. 도와주세요!

다음은 XML이다 :

<?xml version="1.0"?> 
<PCStore> 
<Components> 
    <Motherboards> 
     <MB_Producer id="1">ASRock</MB_Producer> 
     <MB_Producer id="2">GIGABYTE</MB_Producer> 
     <MB_Producer id="3">Foxconn</MB_Producer> 
     <MB_Producer id="4">Asus</MB_Producer> 
     <MB_Producer id="5">MSI</MB_Producer> 
    </Motherboards> 
    <HDDs> 
     <HDD_Producer id="1">WD</HDD_Producer> 
     <HDD_Producer id="2">Seagate</HDD_Producer> 
     <HDD_Producer id="3">Baracuda</HDD_Producer> 
     <HDD_Producer id="4">TOSHIBA</HDD_Producer> 
     <HDD_Producer id="5">LG</HDD_Producer> 
    </HDDs> 
    <Physical_Memory> 
     <RAM_Producer id="1">Kingston</RAM_Producer> 
     <RAM_Producer id="2">Corsair</RAM_Producer> 
     <RAM_Producer id="3">Transcend</RAM_Producer> 
     <RAM_Producer id="4">SanDisk</RAM_Producer> 
     <RAM_Producer id="5">Maxell</RAM_Producer> 
    </Physical_Memory> 
    <CPUs> 
     <CPU_Producer id="1">Intel i3</CPU_Producer> 
     <CPU_Producer id="2">Intel i5</CPU_Producer> 
     <CPU_Producer id="3">Intel i7</CPU_Producer> 
     <CPU_Producer id="4">AMD Athlon</CPU_Producer> 
     <CPU_Producer id="5">AMD Phenom</CPU_Producer> 
    </CPUs> 
    <GPUs> 
     <GPU_Producer id="1">NVIDIA</GPU_Producer> 
     <GPU_Producer id="2">AMD</GPU_Producer> 
     <GPU_Producer id="3">Intel</GPU_Producer> 
     <GPU_Producer id="4">GIGABYTE</GPU_Producer> 
     <GPU_Producer id="5">Sapphire</GPU_Producer> 
     <GPU_Producer id="6">Palit</GPU_Producer> 
    </GPUs> 
    <Cases> 
     <Case_Producer id="1">SPIRE</Case_Producer> 
     <Case_Producer id="2">SWEEX</Case_Producer> 
     <Case_Producer id="3">CoolerMaster</Case_Producer> 
     <Case_Producer id="4">Antec</Case_Producer> 
     <Case_Producer id="5">AOpen</Case_Producer> 
     <Case_Producer id="6">Corsair</Case_Producer> 
    </Cases> 
</Components> 
<Configurations> 
    <Configuration> 
     <Config_Name>Base Model</Config_Name> 
     <MB_Producer>3</MB_Producer> 
     <Case_Producer>1</Case_Producer> 
     <Hard_Drive> 
      <HDD_Producer>1</HDD_Producer> 
      <Size>360GB</Size> 
     </Hard_Drive> 
     <Physical_Memory> 
      <RAM_Producer>3</RAM_Producer> 
      <Size>2GB</Size> 
     </Physical_Memory> 
     <Processor> 
      <CPU_Producer>1</CPU_Producer> 
      <Clock_Rate>2.6Ghz</Clock_Rate> 
     </Processor> 
     <Video_Card> 
      <GPU_Producer>3</GPU_Producer> 
      <Memory>256MB</Memory> 
     </Video_Card> 
    </Configuration> 
    <Configuration> 
     <Config_Name>Gaming Entry Model</Config_Name> 
     <MB_Producer>2</MB_Producer> 
     <Case_Producer>4</Case_Producer> 
     <Hard_Drive> 
      <HDD_Producer>2</HDD_Producer> 
      <Size>360GB</Size> 
     </Hard_Drive> 
     <Physical_Memory> 
      <RAM_Producer>3</RAM_Producer> 
      <Size>4GB</Size> 
     </Physical_Memory> 
     <Processor> 
      <CPU_Producer>2</CPU_Producer> 
      <Clock_Rate>3.2Ghz</Clock_Rate> 
     </Processor> 
     <Video_Card> 
      <GPU_Producer>2</GPU_Producer> 
      <Memory>512MB</Memory> 
     </Video_Card> 
    </Configuration> 
    <Configuration> 
     <Config_Name>Mid-Level Gaming Model</Config_Name> 
     <MB_Producer>5</MB_Producer> 
     <Case_Producer>2</Case_Producer> 
     <Hard_Drive> 
      <HDD_Producer>4</HDD_Producer> 
      <Size>500GB</Size> 
     </Hard_Drive> 
     <Physical_Memory> 
      <RAM_Producer>5</RAM_Producer> 
      <Size>8GB</Size> 
     </Physical_Memory> 
     <Processor> 
      <CPU_Producer>3</CPU_Producer> 
      <Clock_Rate>3.6Ghz</Clock_Rate> 
     </Processor> 
     <Video_Card> 
      <GPU_Producer>1</GPU_Producer> 
      <Memory>1024MB</Memory> 
     </Video_Card> 
    </Configuration> 
    <Configuration> 
     <Config_Name>Pro-Gamer Model</Config_Name> 
     <MB_Producer>2</MB_Producer> 
     <Case_Producer>3</Case_Producer> 
     <Hard_Drive> 
      <HDD_Producer>2</HDD_Producer> 
      <Size>1024GB</Size> 
     </Hard_Drive> 
     <Physical_Memory> 
      <RAM_Producer>1</RAM_Producer> 
      <Size>16GB</Size> 
     </Physical_Memory> 
     <Processor> 
      <CPU_Producer>3</CPU_Producer> 
      <Clock_Rate>3.8Ghz</Clock_Rate> 
     </Processor> 
     <Video_Card> 
      <GPU_Producer>1</GPU_Producer> 
      <Memory>1024MB</Memory> 
     </Video_Card> 
    </Configuration> 
</Configurations> 
</PCStore> 

그리고 여기에 XSLT의 :

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

<xsl:template match="PCStore"> 
<html> 
<head> 
<title>Configurations</title> 
</head> 
<body> 
<h2>Задача 2, Данаил Найденов, F66840</h2> 
<h3>Configurations</h3> 
<table border="6"> 
<tr bgcolor="#AFAFAF"> 
    <td>Configurations</td> 
    <td>MB_Producer</td> 
</tr> 
<xsl:for-each select="Configurations/Configuration"> 
<xsl:sort select="Config_Name"/> 
<tr> 
    <td><xsl:value-of select="Config_Name"/></td> 
       <td bgcolor="#EFEFEF"> 
        <xsl:apply-templates select="PCStore/Components/Motherboards"> 
         <xsl:with-param name="MB_Producer" select="MB_Producer" /> 
        </xsl:apply-templates> 
       </td> 
</tr> 
</xsl:for-each> 
</table> 
</body> 
</html> 
</xsl:template> 
<xsl:template match="PCStore/Components/Motherboards"> 
    <xsl:param name="MB_Producer" /> 
    <xsl:value-of select="MB_Producer[@id=$MB_Producer]" /> 
</xsl:template> 

</xsl:stylesheet> 

내가 어떤 도움을 주셔서 감사합니다 정말 것 ...

이 시간 내 주셔서 감사합니다!

답변

2

작동하지 않는 시도가 당신의 상황에 있다는 것입니다 이유 :

<xsl:for-each select="Configurations/Configuration"> 

는 당신이 템플릿을 적용 할 때이 :

PCStore/Components/Motherboards 

이것은 상대입니다 경로이고 현재 컨텍스트 노드 (Configuration)에는 PCStore 하위가 없습니다.

<xsl:template match="Motherboards"> 

: 템플릿의 경기 패턴을 정의 할 때 전체 경로를 반복 할 필요가 없습니다

/PCStore/Components/Motherboards 

참고 : 당신의 형태로, 루트에서 시작, 절대 경로를 필요 잘 작동합니다.


부칙 :

직접 질문과 관련,하지만 난 당신이 수행하여이 문제를 단순화 할 수 있다고 생각하지

:

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

<xsl:variable name="components" select="/PCStore/Components" /> 

<xsl:template match="/"> 
<html> 
<head> 
<title>Configurations</title> 
</head> 
<body> 
<h2>Задача 2, Данаил Найденов, F66840</h2> 
<h3>Configurations</h3> 
<table> 
    <tr> 
     <th>Configurations</th> 
     <th>MB_Producer</th> 
    </tr> 
    <xsl:for-each select="PCStore/Configurations/Configuration"> 
    <xsl:sort select="Config_Name"/> 
     <tr> 
      <td><xsl:value-of select="Config_Name"/></td> 
      <td><xsl:value-of select="$components/Motherboards/MB_Producer[@id=current()/MB_Producer]"/></td> 
     </tr> 
    </xsl:for-each> 
</table> 
</body> 
</html> 
</xsl:template> 

</xsl:stylesheet> 

사용하여 얻을 수있는 또 다른 방법입니다 " 성능 측면에서 가장 선호되는 "관련 데이터"를 제공하므로 각 구성 요소 유형에 대해 전용 키를 설정하는 것이 좋습니다.

관련 문제