在进行XML转换时,我想结合多个XSL,以便我可以轻松地重用代码段。
以下作品: Gender.xslt
<?xml version="1.0" encoding="iso-8859-1" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/person/gender" name="gender">
<Geslacht>
<Code>
<xsl:apply-templates select="genderCode" />
</Code>
<Omschrijving>
<xsl:if test="genderCode=1">Mannelijk</xsl:if>
<xsl:if test="genderCode=2">Vrouwlijk</xsl:if>
</Omschrijving>
</Geslacht>
</xsl:template>
</xsl:stylesheet>
应用于以下XML文件时:
<?xml version="1.0" encoding="UTF-16" ?>
<person>
<gender>
<genderCode>1</genderCode>
</gender>
</person>
我得到以下预期结果
<?xml version="1.0" encoding="UTF-8"?>
<Geslacht>
<Code>1</Code>
<Omschrijving>Mannelijk</Omschrijving>
</Geslacht>
以类似的方式,我转换一个标识符:
ID.xslt
<?xml version="1.0" encoding="iso-8859-1" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/person" name="ssin">
<INSZ>
<xsl:apply-templates select="ssin" />
</INSZ>
</xsl:template>
</xsl:stylesheet>
应用于
<?xml version="1.0" encoding="UTF-16" ?>
<person>
<ssin>123456789</ssin>
</person>
给予
<?xml version="1.0" encoding="UTF-8"?>
<INSZ>123456789</INSZ>
现在我想将两者结合起来
提供以下输入:
<?xml version="1.0" encoding="UTF-16" ?>
<person>
<ssin>1234567891234</ssin>
<gender>
<genderCode>1</genderCode>
</gender>
</person>
我想获得以下结果
<?xml version="1.0" encoding="UTF-8"?>
<Persoon>
<INSZ>1234567891234</INSZ>
<Geslacht>
<Code>1</Code>
<Omschrijving>Mannelijk</Omschrijving>
</Geslacht>
</Persoon>
我的样式表:
<?xml version="1.0" encoding="iso-8859-1" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:include href="Gender.xslt" />
<xsl:include href="ID.xslt" />
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<Persoon>
<xsl:call-template name="gender" />
<xsl:call-template name="ssin" />
<xsl:apply-imports />
</Persoon>
</xsl:template>
问题是性别样式表被调用,但结果为空;结构,但没有数据。 SSIN部分的作用就像一个吊饰。
非常感谢您的帮助!
鲍里
答案 0 :(得分:1)
我建议将第一个转换实施为
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:param name="gender-descriptions" as="xs:string*"
select="'Mannelijk', 'Vrouwlijk'"/>
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="person/gender">
<Geslacht>
<xsl:apply-templates/>
</Geslacht>
</xsl:template>
<xsl:template match="gender/genderCode">
<Code>
<xsl:value-of select="."/>
</Code>
<Omschrijving>
<xsl:value-of select="$gender-descriptions[position() = current()]"/>
</Omschrijving>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/gWvjQfG
第二个转换可以按照注释中所述进行:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="person/ssin">
<INSZ>
<xsl:apply-templates/>
</INSZ>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/gWvjQfG/1
然后导入样式表就可以了
<xsl:template match="person">
<Persoon>
<xsl:apply-templates/>
</Persoon>
</xsl:template>
({https://xsltfiddle.liberty-development.net/gWvjQfG/2的所有模板均以文本形式包含在内,未导入,但结果如您所愿)。