获取变量值到另一个模板

get value of variable to another template

我在互联网上找到了关于将变量传递给其他模板的参考资料。我试图遵循所有参考资料,但无法获得需要填充的值。我有这个 xml 文件:

<Item>
   <Test>
      <ID>123345677</ID>
   </Test>
   <DisplayID>99884534</DisplayID>
</Item>

如果 DisplayID 不为空,我需要填充 MsgId 元素,否则从 ID 获取值。我的 XSLT:

<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:template match="ID">
    <xsl:variable name="IDV" select="substring(.,0,35)"/>
    <xsl:apply-templates select="DisplayID">
        <xsl:with-param name="IDP" select="$IDV"/>
    </xsl:apply-templates>
</xsl:template>
<xsl:template match="DisplayID">
    <xsl:param name="IDP"/>
    <xsl:element name="MsgId">
        <xsl:choose>
            <xsl:when test=".!='' or ./*">
                <xsl:value-of select="substring(.,0,35)"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="substring($IDP,0,35)"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:element>
</xsl:template>

如果 DisplayID 不为 null 的条件有效,但是,如果我删除 DisplayID 的值,则不会从 ID 中获取任何值。不知道我做的对不对。

非常感谢您的反馈。

请试试这个,

参考演示:http://xsltransform.net/ejivdHb/16

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="http://locomotive/bypass/docx" >
<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="Item">
    <xsl:element name="MsgId">
        <xsl:choose>
            <xsl:when test="DisplayID !='' ">
                <xsl:value-of select="substring(DisplayID , 0 ,35)"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="substring(Test/ID,0,35)"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

由于这是 XSLT 2.0 标记,来自@TechBreak 的 match="Item" 模板可以替换为

<xsl:template match="Item">
    <MsgId>
        <xsl:value-of select="substring(
            if (DisplayId != '') 
            then DisplayID 
            else Test/ID, 1 ,35)"/>
    </MsgId>
</xsl:template>

(注意字符从1开始计数)