【问题标题】:Including multiple XSLs into one将多个 XSL 合二为一
【发布时间】: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 部分就像一个魅力。

非常感谢任何帮助!

巴里

【问题讨论】:

  • 你能改变样式表模块的结构吗?一般来说,我会尝试依赖模板匹配和应用模板,而不是应用和调用模板的组合。如果第二个样式表使用&lt;xsl:template match="person/ssin"&gt;&lt;INSZ&gt;&lt;xsl:apply-templates/&gt;&lt;/INSZ&gt;&lt;/xsl:template&gt;,你的生活会更轻松。
  • 您可以应用为 match="*" 创建默认规则的所有内容,除了应用更多模板之外什么也不做。这也是@MartinHonnen 的方法。或者,您可以更改模板的范围。目前没有任何事情发生,因为您的性别模板在性别元素内应用了特定的 xpath。但是您当前的范围不在性别元素之内。您可以使用 之类的东西并在其中调用模板,因为 for- eaches 也改变了范围。
  • 你好@MartinHonnen。谢谢你的评论。这几乎可行,除了 INSZ 现在也围绕性别块,这是不受欢迎的......
  • 感谢您的评论@ChristianMosz,将我推向正确的方向(我认为)

标签: xml xslt transformation


【解决方案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 以文本形式包含所有模板,未导入,但结果如您所愿)。

【讨论】:

    猜你喜欢
    • 2019-11-06
    • 2016-03-18
    • 2010-12-15
    • 2020-12-08
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 2019-01-16
    相关资源
    最近更新 更多