代码之家  ›  专栏  ›  技术社区  ›  Kathi

XSLT:定义节点id[closed]

  •  0
  • Kathi  · 技术社区  · 12 年前

    我想输出一些节点。其中一些被定义为目标节点。有些是源节点。

    输入类似于

    <?xml version="1.0" encoding="UTF-8"?>
    <Element type="node" id="Node-a" name="a"/>
    <Element type="node" id="Node-b" name="b"/>
    <Element type="node" id="Node-c" name="c"/>
    ......
    

    首先我尝试了这个

    <source node id="{generate-id()}"/>
    <target node id="{generate-id()}"/>
    

    它可以输出所有节点。但问题是存在双节点。

    所以我试着这样做

    <source node id="{generate-id(@source)}"/>
    <target node id="{generate-id(@target)}"/>
    

    然而,之后我发现结果只能输出两个节点。

    我想问如何定义正确的节点id,然后才能将它们分开。或者我应该定义一些变量?请帮帮我,谢谢。

    1 回复  |  直到 12 年前
        1
  •  0
  •   PhillyNJ    12 年前

    第一

    这是无效的:

    <source node id="{generate-id()}"/>
    

    属性 node 必须具有值。

    为了回答您的问题,我会使用 generate-id 和 position() 上的函数 target 元素获取唯一的id。由于我没有一个好的输入文档,我创建了一个示例:

    <data>
        <Element type="node" id="Node-a" name="a"/>
        <Element type="node" id="Node-b" name="b"/>
        <Element type="node" id="Node-c" name="c"/>
    </data>
    

    XSLT:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
        <xsl:output method="html" indent="yes"/>
        <xsl:template match="/">
            <xsl:for-each select="data">
                <xsl:copy>
                    <xsl:apply-templates/>
                </xsl:copy>
            </xsl:for-each>
        </xsl:template>
        <xsl:template match="Element">
            <xsl:element name="source">
                <xsl:attribute name="node">
                    <xsl:value-of select="@type"/>
                </xsl:attribute>
                <xsl:attribute name="id">
                    <xsl:value-of select="generate-id(.)"/>
                </xsl:attribute>
            </xsl:element>
            <xsl:element name="target">
                <xsl:attribute name="node">
                    <xsl:value-of select="@type"/>
                </xsl:attribute>
                <xsl:attribute name="id">
                    <xsl:value-of select="concat(generate-id(.), '-', position())"/>
                </xsl:attribute>
            </xsl:element>
        </xsl:template>
    </xsl:stylesheet>