XSLT - 连接子值



我有一个这样的示例XML:

<Record id="1">
 <Field id="1" name="Field1">
  <ListValues>
   <ListValue id="1" displayName="Bank">Bank</ListValue>
   <ListValue id="2" displayName="Personal">Personal</ListValue>
  </ListValues>
 </Field>
 <Field id="2" name="Field2"/>
</Record>

我需要组合所有 ID 以在输出 XML 中创建一个关键字段,如下所示:

<Record>
 <KeyField>1-1-12</KeyField>
</Record>

此键字段是记录 ID、字段 ID(字段 1 的 - 始终)和字段 1 的子字段的集合。这些子项 (ListValue) 可以有超过 100-150 个值,我需要将它们组合起来形成我的键字段(使用分隔符是可选的)。

目前,我以这种方式执行相同的操作:

<KeyField>
 <xsl:value-of select="concat(../Record/@id,'-',Field[@name='Field1']/@id,'-', concat(Field[@name='Field1']/ListValues/ListValue/@id,Field[@name='Field1']/ListValues/ListValue[2]/@id, and so on..))"/>
</KeyField>

问题是,如果我有 100-150 个这样的值,我就不能继续在 KeyField 元素中添加这些值。有没有办法我可以预先计算它并在我的关键字段元素中使用它,还有,我如何遍历所有这些值?

我正在使用 XSL 1.0。

下面是

一个 XSL 1.0 解决方案,其中包含一个命名模板,可以调用该模板来检索每条记录的键字段。

使用的 XML:

<Record id="1">
 <Field id="1" name="Field1">
  <ListValues>
   <ListValue id="1" displayName="Bank">Bank</ListValue>
   <ListValue id="2" displayName="Personal">Personal</ListValue>
   <ListValue id="3" displayName="Personal">Personal</ListValue>
   <ListValue id="4" displayName="Personal">Personal</ListValue>
   <ListValue id="5" displayName="Personal">Personal</ListValue>
   <ListValue id="6" displayName="Personal">Personal</ListValue>
   <ListValue id="7" displayName="Personal">Personal</ListValue>
   <ListValue id="8" displayName="Personal">Personal</ListValue>
  </ListValues>
 </Field>
 <Field id="2" name="Field2"/>
</Record>

使用的 XSLT

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <xsl:template match="/">
      <xsl:for-each select="/Record">
          <xsl:element name="Record">
              <xsl:call-template name="GetKeyField">
                  <xsl:with-param name="record" select="current()" />
              </xsl:call-template>
          </xsl:element>
      </xsl:for-each>
  </xsl:template>
  <xsl:template name="GetKeyField">
      <xsl:param name="record" />
      <xsl:variable name="recordId" select="$record/@id" />
      <xsl:variable name="fieldId" select="$record/Field[@name='Field1']/@id" />
      <xsl:variable name="listValueIds">
          <xsl:for-each select="$record/Field[@name='Field1']//ListValue">
              <xsl:value-of select="@id" />
          </xsl:for-each>
      </xsl:variable>
      <xsl:element name="KeyField">
        <xsl:value-of select="normalize-space(concat($recordId, '-', $fieldId, '-', $listValueIds))" />
      </xsl:element>
  </xsl:template>
</xsl:stylesheet>

结果:

<?xml version="1.0" encoding="UTF-8"?>
<Record><KeyField>1-1-12345678</KeyField></Record>

未测试:

<xsl:template match="Record">
   <xsl:element name="Keyfield">
      <xsl:value-of select="@id" />-<xsl:apply-templates />
    </xsl:element>
</xsl:template>
<xsl:template match="Field">
   <xsl:value-of select="@id" />-
</xsl:template>
<xsl:template match="ListValues><xsl:apply-templates /></xsl:template>
<xsl:template match="ListValue><xsl:value-of select="@id" /></xsl:template>

刚输入! 所以请原谅错别字!

好的

,所以我在 XSLT 2.0 中找到了一个解决方案:

我创建了一个变量:

<xsl:variable name="Key_NewField">
 <xsl:value-of select="Field[@name='Field1']/ListValues/ListValue[position() &lt;= 150]/@id" />
</xsl:variable>

然后在 <KeyField> 元素中使用此变量 ($Key_NewField) 作为最后一个串联的一部分。

这给了我输出(这是需要的):

<Record>
 <KeyField>1-1-1 2</KeyField>
</Record>

对于 XSLT (1.0):

<xsl:variable name="Key_NewField">
 <xsl:for-each select="Field[@name = 'Field1']/ListValues/ListValue">
  <xsl:value-of select="@id"/>
 </xsl:for-each>
</xsl:variable>

这给了我以下输出:

<Record>
 <KeyField>1-1-12</KeyField>
</Record>

相关内容

  • 没有找到相关文章

最新更新