XSLT - 将值连接到现有值

时间:2017-01-16 18:25:02

标签: xml xslt xpath

我有以下XML:

enter image description here

我希望 id 成为子名+子名2的串联。示例:对于第一个id,将是:ThinkVision,第二个:LenovoMind

这是通过xsl:for-each吗?

实现的

我尝试使用以下xslt:

         

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>


<xsl:template match="/records/record/customList/customBucket[fn:lower-case(customName)='id']/customValue/text()">
    <xsl:for-each select="/records/record/customList">
        <xsl:value-of select="concat(customBucket[fn:lower-case(customName)='subname']/customValue/text(),customBucket[fn:lower-case(customName)='subname2']/customValue/text())"/>
    </xsl:for-each>
</xsl:template>

但是我得到了每个记录的连接而不是当前的记录:

enter image description here

示例XML:<records> <record> <customList> <customBucket> <customName>id</customName> <customValue>default</customValue> </customBucket> <customBucket> <customName>subname</customName> <customValue>Think</customValue> </customBucket> <customBucket> <customName>subname2</customName> <customValue>Vision</customValue> </customBucket> </customList> </record> <record> <customList> <customBucket> <customName>id</customName> <customValue>default</customValue> </customBucket> <customBucket> <customName>subname</customName> <customValue>Lenovo</customValue> </customBucket> <customBucket> <customName>subname2</customName> <customValue>Mind</customValue> </customBucket> </customList> </record> <record> <customList> <customBucket> <customName>id</customName> <customValue>default</customValue> </customBucket> <customBucket> <customName>subname</customName> <customValue>Think</customValue> </customBucket> <customBucket> <customName>subname2</customName> <customValue>Vision</customValue> </customBucket> </customList> </record> <record> <customList> <customBucket> <customName>id</customName> <customValue>default</customValue> </customBucket> <customBucket> <customName>subname</customName> <customValue>Mapped</customValue> </customBucket> <customBucket> <customName>subname2</customName> <customValue>Safe</customValue> </customBucket> </customList> </record> <record> <customList> <customBucket> <customName>id</customName> <customValue>default</customValue> </customBucket> <customBucket> <customName>subname</customName> <customValue>Sony</customValue> </customBucket> <customBucket> <customName>subname2</customName> <customValue>DCO</customValue> </customBucket> </customList> </record> </records>

预期产出

<?xml version="1.0" encoding="UTF-8"?>
<records>
<record>
    <customList>
        <customBucket>
            <customName>id</customName>
            <customValue>ThinkVision</customValue>
        </customBucket>
        <customBucket>
            <customName>subname</customName>
            <customValue>Think</customValue>
        </customBucket>
        <customBucket>
            <customName>subname2</customName>
            <customValue>Vision</customValue>
        </customBucket>
    </customList>
</record>
<record>
    <customList>
        <customBucket>
            <customName>id</customName>
            <customValue>LenovoMind</customValue>
        </customBucket>
        <customBucket>
            <customName>subname</customName>
            <customValue>Lenovo</customValue>
        </customBucket>
        <customBucket>
            <customName>subname2</customName>
            <customValue>Mind</customValue>
        </customBucket>
    </customList>
</record>
</records>

==

情景#2

INPUT:

<records>
    <record>
        <customList>
            <customBucket>
                <customName>id</customName>
                <customValue>default</customValue>
            </customBucket>
            <customBucket>
                <customName>subname</customName>
                <customValue>Think</customValue>
            </customBucket>
            <customBucket>
                <customName>subname2</customName>
                <customValue>Vision</customValue>
            </customBucket>
        </customList>
    </record>
    <record>
        <customList>
            <customBucket>
                <customName>id</customName>
                <customValue>default</customValue>
            </customBucket>
            <customBucket>
                <customName>subname</customName>
                <customValue>Lenovo</customValue>
            </customBucket>
            <customBucket>
                <customName>subname2</customName>
                <customValue>Mind</customValue>
            </customBucket>
        </customList>
    </record>
    <record>
        <customList>
            <customBucket>
                <customName>id</customName>
                <customValue>default</customValue>
            </customBucket>
            <customBucket>
                <customName>subname</customName>
                <customValue>Think</customValue>
            </customBucket>
            <customBucket>
                <customName>subname2</customName>
                <customValue>Vision</customValue>
            </customBucket>
        </customList>
    </record>
    <record>
        <customList>
            <customBucket>
                <customName>id</customName>
                <customValue>default</customValue>
            </customBucket>
            <customBucket>
                <customName>subname</customName>
                <customValue>Mapped</customValue>
            </customBucket>
            <customBucket>
                <customName>subname2</customName>
                <customValue>Safe</customValue>
            </customBucket>
        </customList>
    </record>
    <record>
        <customList>
            <customBucket>
                <customName>id</customName>
                <customValue>default</customValue>
            </customBucket>
            <customBucket>
                <customName>subname</customName>
                <customValue>Sony</customValue>
            </customBucket>
            <customBucket>
                <customName>subname2</customName>
                <customValue>DCO</customValue>
            </customBucket>
        </customList>
    </record>
</records>

预期输出

<records>
    <record>
        <customList>
            <customBucket>
                <customName>id</customName>
                <customValue>default</customValue>
            </customBucket>
            <customBucket>
                <customName>newid</customName>
                <customValue>ThinkVision</customValue>
            </customBucket>
            <customBucket>
                <customName>subname</customName>
                <customValue>Think</customValue>
            </customBucket>
            <customBucket>
                <customName>subname2</customName>
                <customValue>Vision</customValue>
            </customBucket>
        </customList>
    </record>
    <record>
        <customList>
            <customBucket>
                <customName>id</customName>
                <customValue>default</customValue>
            </customBucket>
            <customBucket>
                <customName>newid</customName>
                <customValue>LenovoMind</customValue>
            </customBucket>
            <customBucket>
                <customName>subname</customName>
                <customValue>Lenovo</customValue>
            </customBucket>
            <customBucket>
                <customName>subname2</customName>
                <customValue>Mind</customValue>
            </customBucket>
        </customList>
    </record>
    <record>
        <customList>
            <customBucket>
                <customName>id</customName>
                <customValue>default</customValue>
            </customBucket>
            <customBucket>
                <customName>newid</customName>
                <customValue>ThinkVision</customValue>
            </customBucket>
            <customBucket>
                <customName>subname</customName>
                <customValue>Think</customValue>
            </customBucket>
            <customBucket>
                <customName>subname2</customName>
                <customValue>Vision</customValue>
            </customBucket>
        </customList>
    </record>
    <record>
        <customList>
            <customBucket>
                <customName>id</customName>
                <customValue>default</customValue>
            </customBucket>
            <customBucket>
                <customName>newid</customName>
                <customValue>MappedSafe</customValue>
            </customBucket>
            <customBucket>
                <customName>subname</customName>
                <customValue>Mapped</customValue>
            </customBucket>
            <customBucket>
                <customName>subname2</customName>
                <customValue>Safe</customValue>
            </customBucket>
        </customList>
    </record>
    <record>
        <customList>
            <customBucket>
                <customName>id</customName>
                <customValue>default</customValue>
            </customBucket>
            <customBucket>
                <customName>newid</customName>
                <customValue>SonyDCO</customValue>
            </customBucket>
            <customBucket>
                <customName>subname</customName>
                <customValue>Sony</customValue>
            </customBucket>
            <customBucket>
                <customName>subname2</customName>
                <customValue>DCO</customValue>
            </customBucket>
        </customList>
    </record>
</records>

基本上没有覆盖'id',这里的想法是创建一个名为'newid'的新节点,其逻辑与方案1相同:子名+子名2的连接。

enter image description here

SCENARIO 2.1

预期输出(与方案2相同,但重命名了原始ID)

我添加了以下代码,但它没有重命名id。

<xsl:param name="normRenamedID" select="'id_renamed'"/>

    <!-- Rename clientPortfolioID to RM_clientPortfolioID-->
    <xsl:template match="/customBucket[fn:lower-case(customName)='clientportfolioid']/customName/text()">
        <xsl:value-of select="$normRenamedID"/>
    </xsl:template>


<records>
    <record>
        <customList>
            <customBucket>
                <customName>id_renamed</customName>
                <customValue>default</customValue>
            </customBucket>
            <customBucket>
                <customName>newid</customName>
                <customValue>ThinkVision</customValue>
            </customBucket>
            <customBucket>
                <customName>subname</customName>
                <customValue>Think</customValue>
            </customBucket>
            <customBucket>
                <customName>subname2</customName>
                <customValue>Vision</customValue>
            </customBucket>
        </customList>
    </record>
    <record>
        <customList>
            <customBucket>
                <customName>id_renamed</customName>
                <customValue>default</customValue>
            </customBucket>
            <customBucket>
                <customName>newid</customName>
                <customValue>LenovoMind</customValue>
            </customBucket>
            <customBucket>
                <customName>subname</customName>
                <customValue>Lenovo</customValue>
            </customBucket>
            <customBucket>
                <customName>subname2</customName>
                <customValue>Mind</customValue>
            </customBucket>
        </customList>
    </record>
    <record>
        <customList>
            <customBucket>
                <customName>id_renamed</customName>
                <customValue>default</customValue>
            </customBucket>
            <customBucket>
                <customName>newid</customName>
                <customValue>ThinkVision</customValue>
            </customBucket>
            <customBucket>
                <customName>subname</customName>
                <customValue>Think</customValue>
            </customBucket>
            <customBucket>
                <customName>subname2</customName>
                <customValue>Vision</customValue>
            </customBucket>
        </customList>
    </record>
    <record>
        <customList>
            <customBucket>
                <customName>id_renamed</customName>
                <customValue>default</customValue>
            </customBucket>
            <customBucket>
                <customName>newid</customName>
                <customValue>MappedSafe</customValue>
            </customBucket>
            <customBucket>
                <customName>subname</customName>
                <customValue>Mapped</customValue>
            </customBucket>
            <customBucket>
                <customName>subname2</customName>
                <customValue>Safe</customValue>
            </customBucket>
        </customList>
    </record>
    <record>
        <customList>
            <customBucket>
                <customName>id_renamed</customName>
                <customValue>default</customValue>
            </customBucket>
            <customBucket>
                <customName>newid</customName>
                <customValue>SonyDCO</customValue>
            </customBucket>
            <customBucket>
                <customName>subname</customName>
                <customValue>Sony</customValue>
            </customBucket>
            <customBucket>
                <customName>subname2</customName>
                <customValue>DCO</customValue>
            </customBucket>
        </customList>
    </record>
</records>

enter image description here

1 个答案:

答案 0 :(得分:2)

当你这样做时:

customList

您从/根节点开始选择所有 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:strip-space elements="*"/> <!-- identity transform --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="customBucket[customName='id']/customValue"> <xsl:copy> <xsl:value-of select="../../customBucket[customName='subname']/customValue" /> <xsl:value-of select="../../customBucket[customName='subname2']/customValue" /> </xsl:copy> </xsl:template> </xsl:stylesheet> 元素。您当前的上下文在此处不起作用。

要获得您正在寻找的结果,请尝试以下方法:

<xsl:template match="customBucket[customName='id']">
    <xsl:copy-of select="."/>
    <customBucket>
        <customName>newid</customName>
        <customValue>
            <xsl:value-of select="../customBucket[customName='subname']/customValue" />
            <xsl:value-of select="../customBucket[customName='subname2']/customValue" />
        </customValue>
    </customBucket>
</xsl:template>

加了:

对于您添加的方案,请将第二个模板更改为:

<xsl:template match="customBucket[customName='id']">
    <xsl:copy>
        <customName>
            <xsl:value-of select="$normRenamedID" />
        </customName>
        <xsl:apply-templates select="customValue"/>
    </xsl:copy>
    <customBucket>
        <customName>newid</customName>
        <customValue>
            <xsl:value-of select="../customBucket[customName='subname']/customValue" />
            <xsl:value-of select="../customBucket[customName='subname2']/customValue" />
        </customValue>
    </customBucket>
</xsl:template>

已添加2:

对于其他方案,请将第二个模板更改为:

[(Libri,50.0),(Proxis,20.0),(Proxis,45.0),(Amazon,45.0)]