首页 > 解决方案 > 基于节点变量增量 xml 中的值的 xml 的 xslt 转换

问题描述

我有一个基于 java 的应用程序将数据输入到一个表中,其中的列按名称 fieldName 及其 fieldValue 我试图以数组格式重新分组以供其他用途我尝试使用 for-each 在客户之后和之前获取子字符串:但它的不能那样工作 输入:

<Data>
      <fieldName>customer0:fname</fieldName>
      <fieldValue>fremont</fieldValue>
   </Data>
   <Data>
      <fieldName>customer0:mname<</fieldName>
      <fieldValue>u</fieldValue>
   </Data>
   <Data> 
      <fieldName>customer0:Lname<</fieldName>
      <fieldValue>usa</fieldValue>
   </Data>
   <Data>
      <fieldName>customer1:fname</fieldName>
      <fieldValue>Hyd</fieldValue>
   </Data>
   <Data>
      <fieldName>customer1:mname<</fieldName>
      <fieldValue>M</fieldValue>
   </Data>
   <Data> 
      <fieldName>customer1:Lname<</fieldName>
      <fieldValue>india</fieldValue>
   </Data>

OUTPUT:
I am trying to convert this into below format 
  <responsexml>
    <ResponseList>
      <firstname>fremont</firstname>
      <middlename>u</middlename>
      <lastname>usa</lastname>
    </ResponseList>
    <ResponseList>
      <firstname>hyd</firstname>
      <middlename>M</middlename>
      <lastname>india</lastname>
    </ResponseList>
  </responsexml>


标签: xsltforeachsubstringxslt-1.0xslt-2.0

解决方案


以下 XSL 应用于以下 XML 作品。首先,我对客户进行分组(关键功能)。我正在考虑“:”之前的所有内容都是客户编号。

之后,对于分组内的每个实例,我测试 fieldName 以检查它是名字、姓氏还是中间名(所有选项),然后将值添加到正确的节点。

XSL:

<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <xsl:key name="Customer" match="Data" use="substring-before(fieldName, ':')" />


    <xsl:template match="root">
        <responsexml>
            <xsl:for-each select="Data[generate-id() = generate-id(key('Customer', substring-before(fieldName, ':'))[1])]">
                <ResponseList>
                    <xsl:for-each select="key('Customer', substring-before(fieldName, ':'))">
                        <xsl:choose>
                            <xsl:when test="substring-after(fieldName, ':') = 'fname'">
                                <firstname>
                                    <xsl:value-of select="fieldValue"/>
                                </firstname>
                            </xsl:when>
                            <xsl:when test="substring-after(fieldName, ':') = 'mname'">
                                <middlename>
                                    <xsl:value-of select="fieldValue"/>
                                </middlename>
                            </xsl:when>
                            <xsl:when test="substring-after(fieldName, ':') = 'Lname'">
                                <lastname>
                                    <xsl:value-of select="fieldValue"/>
                                </lastname>
                            </xsl:when>
                        </xsl:choose>
                    </xsl:for-each>
                </ResponseList>
            </xsl:for-each>
        </responsexml>

    </xsl:template>
</xsl:stylesheet>

XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
    <Data>
        <fieldName>customer0:fname</fieldName>
        <fieldValue>fremont</fieldValue>
    </Data>
    <Data>
        <fieldName>customer0:mname</fieldName>
        <fieldValue>u</fieldValue>
    </Data>
    <Data> 
        <fieldName>customer0:Lname</fieldName>
        <fieldValue>usa</fieldValue>
    </Data>
    <Data>
        <fieldName>customer1:fname</fieldName>
        <fieldValue>Hyd</fieldValue>
    </Data>
    <Data>
        <fieldName>customer1:mname</fieldName>
        <fieldValue>M</fieldValue>
    </Data>
    <Data> 
        <fieldName>customer1:Lname</fieldName>
        <fieldValue>india</fieldValue>
    </Data>
</root>

推荐阅读