包括多个XSL

时间:2019-05-13 11:39:30

标签: xml xslt transformation

在进行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部分的作用就像一个吊饰。

非常感谢您的帮助!

鲍里

1 个答案:

答案 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的所有模板均以文本形式包含在内,未导入,但结果如您所愿)。