在 XSLT 中使用模板匹配更新多个节点值

问题描述 投票:0回答:1

输入XML

<root>
    <Bank>
        <BankDetail>
            <Name1>BankName</Name1>
            <Name2>TestBank</Name2>
        </BankDetail>
    </Bank>
    <Item>
        <Item1>Text</Item1>
    </Item>
    <Item>
        <Item1>Text</Item1>
    </Item>
    <Item>
        <Item1>Text</Item1>
    </Item>
    <Item>
        <Item1>Text</Item1>
    </Item>
    <Item>
        <Item1>Text</Item1>
    </Item>
</root>

我想用 BankItem 1、BankItem 4、BankItem 2、BankItem 5 和 BankItem 3 更新 节点值

所以输出将是

<root>
    <Bank>
        <BankDetail>
            <Name1>BankName</Name1>
            <Name2>TestBank</Name2>
        </BankDetail>
    </Bank>
    <Item>
        <Item1>BankItem - 1</Item1>
    </Item>
    <Item>
        <Item1>BankItem - 4</Item1>
    </Item>
    <Item>
        <Item1>BankItem - 2</Item1>
    </Item>
    <Item>
        <Item1>BankItem - 5</Item1>
    </Item>
    <Item>
        <Item1>BankItem -  3</Item1>
    </Item>
</root>

我已经使用循环完成了此操作。但出于学习目的,我不想使用 For Each 循环。我想通过模板匹配来更新它。我有什么办法可以实现这个目标吗?请推荐。

我没有它工作。我尝试了几个步骤,但后来我觉得我需要一些建议。

<xsl:template match="root/Item/Item1">
    <xsl:variable name="i" select="position()" />
    
    <xsl:copy>
        <xsl:value-of select="Item1[$i]"/>
    </xsl:copy>
        
    </xsl:template>
xslt xslt-1.0
1个回答
0
投票

获得所需输出的一种方法是:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

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

<xsl:template match="Item1">
    <xsl:variable name="i">
        <xsl:number level="any"/>
    </xsl:variable>
    <xsl:copy>
        <xsl:text>BankItem - </xsl:text>
        <xsl:value-of select="substring('14253', $i, 1)"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

很难判断这是否满足您的目标,因为所需转换的逻辑尚不清楚。

© www.soinside.com 2019 - 2024. All rights reserved.