使用 XSLT 转换在 XML 上添加缺失的元素
Adding missing element on XML using XSLT transformation
我对编写 XSLT 转换逻辑还很陌生,所以有人可以帮我解决这个问题。
我正在使用 XSLT 进行 XML 到 XML 的转换,我的想法是插入缺失的元素。
输入XML:
<EmpJob>
<EmpJob>
<emplStatus>3805</emplStatus>
<lastName>Jhonny</lastName>
<firstName>English</firstName>
<EmpJobRelationships>
<relUserNav>
<User>
<defaultName>Crystal</defaultName>
<userId>00174941</userId>
</User>
</relUserNav>
</EmpJobRelationships>
</EmpJob>
<EmpJob>
<emplStatus>3805</emplStatus>
<lastName>Tony</lastName>
<firstName>Romo</firstName>
</EmpJob>
<EmpJob>
需要 XML 使用 XSLT 转换的输出
<EmpJob>
<EmpJob>
<emplStatus>3805</emplStatus>
<lastName>Johnny</lastName>
<firstName>English</firstName>
<EmpJobRelationships>
<relUserNav>
<User>
<defaultName>Crystal</defaultName>
<userId>00174941</userId>
</User>
</relUserNav>
</EmpJobRelationships>
</EmpJob>
<EmpJob>
<emplStatus>3805</emplStatus>
<lastName>Tony</lastName>
<firstName>Romo</firstName>
<EmpJobRelationships>
<relUserNav>
<User>
<defaultName></defaultName>
<userId></userId>
</User>
</relUserNav>
</EmpJobRelationships>
</EmpJob>
<EmpJob>
我厌倦了下面的 XSLT,但是缺少的元素曾经添加到第一个 Parent 的末尾,但它希望它发生在每个 child 上。我如何将逻辑放入循环中,以便它发生在每个 child
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*[not(//EmpJobRelationships)]">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<EmpJobRelationships>
<relationshipType></relationshipType>
<relUserNav>
<User>
<defaultFullName></defaultFullName>
<userId></userId>
</User>
</relUserNav>
<userId></userId>
<startDate></startDate>
</EmpJobRelationships>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
谢谢
假设“缺失元素”是 EmpJobRelationships
并且它存在或完全缺失,请尝试:
XSLT 1.0
<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="/EmpJob/EmpJob[not(EmpJobRelationships)]">
<xsl:copy>
<xsl:apply-templates/>
<EmpJobRelationships>
<relUserNav>
<User>
<defaultName/>
<userId/>
</User>
</relUserNav>
</EmpJobRelationships>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
注意匹配模式 /EmpJob/EmpJob
旨在防止将模板应用于同名的根元素。
我对编写 XSLT 转换逻辑还很陌生,所以有人可以帮我解决这个问题。
我正在使用 XSLT 进行 XML 到 XML 的转换,我的想法是插入缺失的元素。
输入XML:
<EmpJob>
<EmpJob>
<emplStatus>3805</emplStatus>
<lastName>Jhonny</lastName>
<firstName>English</firstName>
<EmpJobRelationships>
<relUserNav>
<User>
<defaultName>Crystal</defaultName>
<userId>00174941</userId>
</User>
</relUserNav>
</EmpJobRelationships>
</EmpJob>
<EmpJob>
<emplStatus>3805</emplStatus>
<lastName>Tony</lastName>
<firstName>Romo</firstName>
</EmpJob>
<EmpJob>
需要 XML 使用 XSLT 转换的输出
<EmpJob>
<EmpJob>
<emplStatus>3805</emplStatus>
<lastName>Johnny</lastName>
<firstName>English</firstName>
<EmpJobRelationships>
<relUserNav>
<User>
<defaultName>Crystal</defaultName>
<userId>00174941</userId>
</User>
</relUserNav>
</EmpJobRelationships>
</EmpJob>
<EmpJob>
<emplStatus>3805</emplStatus>
<lastName>Tony</lastName>
<firstName>Romo</firstName>
<EmpJobRelationships>
<relUserNav>
<User>
<defaultName></defaultName>
<userId></userId>
</User>
</relUserNav>
</EmpJobRelationships>
</EmpJob>
<EmpJob>
我厌倦了下面的 XSLT,但是缺少的元素曾经添加到第一个 Parent 的末尾,但它希望它发生在每个 child 上。我如何将逻辑放入循环中,以便它发生在每个 child
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*[not(//EmpJobRelationships)]">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<EmpJobRelationships>
<relationshipType></relationshipType>
<relUserNav>
<User>
<defaultFullName></defaultFullName>
<userId></userId>
</User>
</relUserNav>
<userId></userId>
<startDate></startDate>
</EmpJobRelationships>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
谢谢
假设“缺失元素”是 EmpJobRelationships
并且它存在或完全缺失,请尝试:
XSLT 1.0
<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="/EmpJob/EmpJob[not(EmpJobRelationships)]">
<xsl:copy>
<xsl:apply-templates/>
<EmpJobRelationships>
<relUserNav>
<User>
<defaultName/>
<userId/>
</User>
</relUserNav>
</EmpJobRelationships>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
注意匹配模式 /EmpJob/EmpJob
旨在防止将模板应用于同名的根元素。