XSLT使用引用转换XML



我对xml&xslt和一般编程。我正在尝试用xslt转换一个xml文件。我的xml文件应该反映这个ERD。为了设计实体之间的关系,我决定使用一些id。这是我的xml代码:

<?xml version="1.0" encoding= "UTF-8"?>
<data>
<aisles>
<aisle idaisle="A">
<letteraisle>A</letteraisle>
</aisle>
<aisle idaisle="B">
<letteraisle>B</letteraisle>
</aisle>
</aisles>
<shelves>
<shelf idshelf = "A1">
<numbershelf>1</numbershelf>
<lettershelf>A</lettershelf>
<aisleid idaisle="A"/>
</shelf>
<shelf idshelf = "A2">
<numbershelf>2</numbershelf>
<lettershelf>A</lettershelf>
<aisleid idaisle="A"/>
</shelf>
<shelf idshelf = "B1">
<numbershelf>1</numbershelf>
<lettershelf>B</lettershelf>
<aisleid idaisle="B"/>
</shelf>
<shelf idshelf = "B2">
<numbershelf>1</numbershelf>
<lettershelf>B</lettershelf>
<aisleid idaisle="B"/>
</shelf>
</shelves>
<boardgames>
<boardgame>
<name>Cuckoo in a Dark Forest (Kukacka v temném lese) </name>
<productnumber>1301976024</productnumber>
<price>94.7</price>
<shelfid idshelf="B1"/>
</boardgame>
<boardgame>
<name>The Underneath</name>
<productnumber>9117616387</productnumber>
<price>107.4</price>
<shelfid idshelf="A2"/>
</boardgame>
</boardgames>
</data>

这是我的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="/">
<html>
<head>
<link rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" />
</head>
<body>
<table>
<tr>
<td>Name</td>
<td>Price</td>
<td>Product number</td>
<td>Shelf</td>
<td>Shelfnumber</td>
<td>Aisle</td>
</tr>
<xsl:for-each select="data/boardgames/boardgame">
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="price"/></td>
<td><xsl:value-of select="productnumber"/></td>
<td><xsl:value-of select="shelfid"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

我希望我的xslt能够转换棋盘游戏元素中包含的所有信息。我想如果我选择";shelfid";在棋盘游戏元素中,它将选择被引用的元素及其值。我试着对它进行了转换。价格、名称和产品编号都经过了正确的转换。但是shelf元素中的值没有,我试图通过棋盘游戏元素中的shelfid来转换它。是否可以选择引用同级的所有值?如果是,如何?我希望你明白我的意思。谢谢你的帮助!

XSLT有一个内置的机制,用于解析交叉引用。考虑以下示例:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="aisle" match="aisle" use="@idaisle" />
<xsl:key name="shelf" match="shelf" use="@idshelf" />
<xsl:template match="/data">
<html>
<body>
<table border="1">
<tr>
<th>Name</th>
<th>Price</th>
<th>Product Number</th>
<th>Shelf Letter</th>
<th>Shelf Number</th>
<th>Aisle Letter</th>
</tr>
<xsl:for-each select="boardgames/boardgame">
<tr>
<td>
<xsl:value-of select="name"/>
</td>
<td>
<xsl:value-of select="price"/>
</td>
<td>
<xsl:value-of select="productnumber"/>
</td>
<xsl:variable name="shelf" select="key('shelf', shelfid/@idshelf)" />
<td>
<xsl:value-of select="$shelf/lettershelf"/>
</td>
<td>
<xsl:value-of select="$shelf/numbershelf"/>
</td>
<td>
<xsl:value-of select="key('aisle', $shelf/aisleid/@idaisle)/letteraisle"/>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

最新更新