Xml 无法通过变量ID、使用参数、模板和为每个周期选择对象的名称

Xml 无法通过变量ID、使用参数、模板和为每个周期选择对象的名称,xml,xslt,xpath,Xml,Xslt,Xpath,我很确定我做得对,但是我的道路在某个地方被弄乱了 我试图做的是创建一个表,其中包含XML中具有i5或i7处理器的所有配置的信息,从configurations元素获取组件ID,并将它们与components元素中的组件名称匹配。我只尝试对两个元素执行此操作-Config_Name和MB_Producer。Config_名称已成功显示,但我无法获取主板的名称。请帮忙 以下是XML: <?xml version="1.0"?> <PCStore> <Components

我很确定我做得对,但是我的道路在某个地方被弄乱了

我试图做的是创建一个表,其中包含XML中具有i5或i7处理器的所有配置的信息,从configurations元素获取组件ID,并将它们与components元素中的组件名称匹配。我只尝试对两个元素执行此操作-Config_Name和MB_Producer。Config_名称已成功显示,但我无法获取主板的名称。请帮忙

以下是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>

阿斯洛克
千兆字节
富士康
华硕
微星
WD
希捷
扒了裤打
东芝
LG
金斯敦
海盗
超越
桑迪克斯
马克塞尔
英特尔i3
英特尔i5
英特尔i7
阿特隆酒店
黄斑变性
英伟达
AMD
英特尔
千兆字节
蓝宝石
帕利特
尖顶
瑞典人
讯凯
安泰克
奥彭
海盗
基本模型
3.
1.
1.
360GB
3.
2GB
1.
2.6Ghz
3.
256MB
博弈进入模型
2.
4.
2.
360GB
3.
4GB
2.
3.2Ghz
2.
512MB
中级博弈模型
5.
2.
4.
500GB
5.
8GB
3.
3.6Ghz
1.
1024MB
职业玩家模型
2.
3.
2.
1024GB
1.
16GB
3.
3.8Ghz
1.
1024MB
这里是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>

配置
第二届,第二届,F66840
配置
配置
MB_生产商
我真的很感激任何帮助


谢谢你抽出时间

您的尝试失败的原因是您处于以下环境中:

<xsl:for-each select="Configurations/Configuration">
这是一个相对路径,当前上下文节点(配置)没有PCStore子节点。您需要一个从根开始的绝对路径,形式如下:

 /PCStore/Components/Motherboards
请注意,在定义模板的匹配模式时,不需要重复整个路径:

<xsl:template match="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>

配置
第二届,第二届,F66840
配置
配置
MB_生产商
使用是获取“相关”数据的另一种方法,也是性能方面最受欢迎的方法,因此为每种组件类型设置专用键可能是值得的

<?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>