我有一个这样的示例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() <= 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>