XSLT:如果不存在,则创建节点

XSLT:如果不存在,则创建节点,xslt,xml-parsing,Xslt,Xml Parsing,我知道类似的问题已经存在,但似乎没有一个适合我 所以,很快,我就有了标记为“Lokal”的XML文件,在大多数情况下,它不会出现,但应该出现。不要让事情变得更简单:我还需要将“Lokal”的名称改为“Lokal_test”。我的目标是修改节点名(如果存在)或创建它并重命名(如果不存在)。 来自XML的数据将被导入MS Access数据,因此它们需要与表完全匹配 示例XML: 3a 波德拉谢省 8r 2. 马佐夫舍省 您的方法是正确的,但不完整。您只创建了新的Local\u test元素 因此

我知道类似的问题已经存在,但似乎没有一个适合我

所以,很快,我就有了标记为“Lokal”的XML文件,在大多数情况下,它不会出现,但应该出现。不要让事情变得更简单:我还需要将“Lokal”的名称改为“Lokal_test”。我的目标是修改节点名(如果存在)或创建它并重命名(如果不存在)。 来自XML的数据将被导入MS Access数据,因此它们需要与表完全匹配

示例XML:


3a
波德拉谢省
8r
2.
马佐夫舍省

您的方法是正确的,但不完整。您只创建了新的
Local\u test
元素

因此,请尝试将这两个模板与标识模板结合使用:


第二个模板将
Lokal_test
元素放在
Wojewodztwo
元素之前,并复制周围的节点。


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

    <xsl:template match="AdresGlownegoMiejscaWykonywaniaDzialalnosci/Budynek">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
            <xsl:choose>
                <xsl:when test="exists(following-sibling::Lokal)">
                    <Lokal_test>
                    <xsl:value-of select="following-sibling::Lokal"/>
                    </Lokal_test>
                </xsl:when>
                <xsl:when test="not(following-sibling::Lokal)">

                    <xsl:element name="Lokal_test"/>
            </xsl:when>
            </xsl:choose>


    </xsl:template>
    <xsl:template match="Lokal"/>

谢谢,它似乎确实有效。然而,粘贴到我的代码它没有。换句话说,它可以单独工作,但不能与代码的其余部分一起工作。另外,我似乎放不下正确的地方——它在最后弹出,而不是在我想要的中间……我更新了我的答案,以便新的<代码> LoklasyTest< /Cl> >出现在<代码> Wojewodztwo < /Cl>标签。你的完整代码中到底有什么不起作用?好吧,我设法找到了问题所在。当我试图将父项(
AdresGlownegoMiejscaWykonywaniaDzialalnosci
)去除到新创建的
Lokal_test
时,它在转换后消失。在我的代码中不需要父元素,但是
Lokal_test
很重要。通过从第二个模板中删除
xsl:copy
,可以删除/不复制
AdresGlownegoMiejscaWykonywaniaDzialalnosci
元素。您的全部期望输出现在是什么样子的?尝试隔离问题,但看起来不那么容易。所需的输出只有:
标记,按顺序和层次排列。它可以工作,但不能同时工作。在在线测试工具中粘贴时,它可以工作。但是Access说:
存在(在sibling::Lokal之后)
不是XSLT或XPath的有效函数:(
<xsl:template match="@*|node()">
       <xsl:copy>
           <xsl:apply-templates select="@*|node()"/>
       </xsl:copy>
   </xsl:template>

    <xsl:template match="AdresGlownegoMiejscaWykonywaniaDzialalnosci/Budynek">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
            <xsl:choose>
                <xsl:when test="exists(following-sibling::Lokal)">
                    <Lokal_test>
                    <xsl:value-of select="following-sibling::Lokal"/>
                    </Lokal_test>
                </xsl:when>
                <xsl:when test="not(following-sibling::Lokal)">

                    <xsl:element name="Lokal_test"/>
            </xsl:when>
            </xsl:choose>


    </xsl:template>
    <xsl:template match="Lokal"/>