0

我正在尝试通过地图将单个出生名称节点和多个姓氏节点转换为重复的其他姓氏节点。我遇到了一些困难,即当出生名称节点不存在时,无法写入多个姓氏节点。

我已经尝试了围绕 functoids 的多种实现,并且 xslt 调用模板似乎都没有工作,只要缺少出生名称就不会输出姓氏元素。

这可以在地图上的 functoids 中完成吗?还是必须通过 xslt 调用模板来完成?

模式输入

<root>
  <Subject>
    <birthname>
      <name>Birthname</name>
    </birthname>
    <multiplesurname>
      <name>surname</name>
    </multiplesurname>
    <multiplesurname>
      <name>surname2</name>
    </multiplesurname>
    <multiplesurname>
      <name>surname3</name>
    </multiplesurname>
  </Subject>
  <Mother></Mother>
  <Farther></Farther>
  <Other></Other>
</root>

模式输出

<root>
  <persona>
    <Othername>Birthname</Othername>
    <Othername>surname</Othername>
    <Othername>surname2</Othername>
    <Othername>surname3</Othername>
  </persona>
  <personb></personb>
</root>
4

3 回答 3

1

我认为您的问题可能是由于有一个名称节点,然后是一个也命名为名称的后代节点。这可能会导致您陷入无限循环。这里有一些 XSLT 代码可以帮您完成工作。

  <xsl:template match="name">
    <xsl:copy>
      <xsl:apply-templates select=".//name" mode="secondName"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="name" mode="secondName">
    <xsl:element name="Othername">
      <xsl:value-of select="."/>
    </xsl:element>
  </xsl:template>

   <!-- Identity. -->
   <xsl:template match="@* | node()">
     <xsl:copy>
       <xsl:apply-templates select="@* | node()"/>
     </xsl:copy>
   </xsl:template>
于 2017-02-15T21:11:03.150 回答
0

在使用 XSLT 调用模板遇到更多困难后,我发现使用 functoids 的解决方案是可能的,并且可以使用来自出生名和多姓氏的循环 functoids 以及从源节点到目标节点的直接链接的组合来实现。

于 2017-03-24T08:28:47.167 回答
0

您可能可以使用 table looper 执行此操作,但它的 XSLT 调用模板应该不会太糟糕 - 这样的事情应该适合您:

<xsl:template name="nameFlattener">
    <xsl:param name="birthname"/>
    <xsl:element name="Othername">
        <xsl:value-of select="$birthname"/>
    </xsl:element>
    <xsl:for-each select="//multiplesurname">
        <xsl:element name="Othername">
            <xsl:value-of select="name"/>
        </xsl:element>
    </xsl:for-each>
</xsl:template>

让您的name节点birthname作为第一个参数进入该模板,并将其输出到Othername目标上的重复节点。

于 2017-02-17T20:55:45.320 回答