我想在XSLT中读取XML文件并检查其节点。如果它们与我应用转换的XML节点的值匹配,则获取XML节点的值并使用它来构造新的XML结构。
这是一个说明我的问题的例子。我想很多人可以使用这个问题来参考实现类似的功能。
Referenced.xml
<xml>
<root>
<Id id = "1">
<fields>
<field>
<name> Name1 </name>
<value> Val1 </value>
</field>
<field>
<name> Name2 </name>
<value> Val2 </value>
</field>
</fields>
</Id>
<Id id = "2">
...
</Id>
</root>
</xml>
Xml.xml
<XML>
<Fields>
<Id id = "1">
<F1> Value1 </F1>
<F2> Value2 </F2>
<F1> Value3 </F1>
<F4> Value4 </F4>
</Id>
</Fields>
</XML>
现在,我想创建一个转换,它将遍历XML文件(Referenced.xml
)并检查两个xml匹配内的Id,然后在该id内Name1 = F1
以及它在哪里然后,获取该'name'的'value'并创建一个类似
<outputXml>
<Field id="Val1">
<val> Value1 </val>
</Field>
<Field id="Val2">
<val> Value2 </val>
</Field> ... and so on
</outputXml>
我知道我必须使用document(),但我不确定如何在xsl内部迭代Referenced.xml
并使用if,else来实现所需的功能?
答案 0 :(得分:6)
检查一下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="file1" select="document('Referenced.xml')"/>
<xsl:param name="file2" select="document('Xml.xml')"/>
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<outputXml>
<xsl:for-each select="$file1//Id">
<xsl:variable name="ReferencedID" select="@id"/>
<xsl:choose>
<xsl:when test="$ReferencedID = $file2//Id/@id">
<xsl:for-each select="fields/field">
<Field id="{normalize-space(value)}"><xsl:value-of select="value"/></Field>
</xsl:for-each>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</outputXml>
</xsl:template>
</xsl:stylesheet>
获得输出:
<outputXml>
<Field id=" Val1 "> Val1 </Field>
<Field id=" Val2 "> Val2 </Field>
</outputXml>
答案 1 :(得分:1)
这是一段有效的代码:
<!-- loads a file like resources/strings-en.xml into a variable document-->
<xsl:variable
name="messages"
select="document(concat('resources/strings-', $lang, '.xml'))/my:strings"
/>
...
<!-- uses the loaded document for selecting -->
<xsl:template name="localized-string">
<xsl:param name="name"/>
<xsl:value-of select="$messages/my:string[@name=$name]"/>
</xsl:template>
正如您所看到的,一旦您将文档读入变量,它看起来像普通文档,您应用XPath表达式来遍历它等等。
答案 2 :(得分:0)
试试这个 您的XML文件 Chapters.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="ditaXSL.xsl"?>
<map>
<title>Syncro phone user guide</title>
<topicref href="gettingStarted.dita"/>
</map>
您的XSl名称: ditaXSL.xsl
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:f="Functions"
version="2.0">
<xsl:template match="map">
<html>
<title>
<xsl:value-of select="title" />
</title>
<h4>
<xsl:value-of select="title" />
</h4>
<body>
<table>
<tr>
<th>TOPIC REF</th>
</tr>
<xsl:for-each select="topicref">
<tr>
<td>
<xsl:apply-templates select="document(@href)/topic" />
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="topic">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="title">
Chapter :
<h6>
<xsl:value-of select="." />
</h6>
</xsl:template>
<xsl:template match="body">
Description :
<h5>
<xsl:value-of select="." />
</h5>
</xsl:template>
</xsl:stylesheet>
xml文件中提到的示例 gettingStarted.dita 文件。
<?xml version="1.0" encoding="UTF-8"?>
<topic>
<title>Getting started</title>
<body>This is introduction</body>
</topic>