【发布时间】:2019-09-30 08:48:28
【问题描述】:
在处理 XML 转换时,我想组合多个 XSL,以便我可以轻松地重用代码 sn-ps。
以下作品: 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 部分就像一个魅力。
非常感谢任何帮助!
巴里
【问题讨论】:
-
你能改变样式表模块的结构吗?一般来说,我会尝试依赖模板匹配和应用模板,而不是应用和调用模板的组合。如果第二个样式表使用
<xsl:template match="person/ssin"><INSZ><xsl:apply-templates/></INSZ></xsl:template>,你的生活会更轻松。 -
您可以应用为 match="*" 创建默认规则的所有内容,除了应用更多模板之外什么也不做。这也是@MartinHonnen 的方法。或者,您可以更改模板的范围。目前没有任何事情发生,因为您的性别模板在性别元素内应用了特定的 xpath。但是您当前的范围不在性别元素之内。您可以使用
或 之类的东西并在其中调用模板,因为 for- eaches 也改变了范围。 -
你好@MartinHonnen。谢谢你的评论。这几乎可行,除了 INSZ 现在也围绕性别块,这是不受欢迎的......
-
感谢您的评论@ChristianMosz,将我推向正确的方向(我认为)
标签: xml xslt transformation