假设我有一个XML,类似于:
<?xml version="1.0" encoding="UTF-8"?>
<t:object xmlns:t="http://prism.evolveum.com/xml/ns/public/types-3"
xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns:apti="http://midpoint.evolveum.com/xml/ns/public/common/api-types-3">
<apti:object oid="2">
<name>34567892</name>
<parentOrgRef oid="1"/>
</apti:object>
<apti:object oid="4">
<name>50001007</name>
<parentOrgRef oid="3"/>
</apti:object>
<apti:object oid="5">
<name>50001012</name>
<parentOrgRef oid="4"/>
</apti:object>
<apti:object oid="6">
<name>50001806</name>
<parentOrgRef oid="5"/>
</apti:object>
<apti:object oid="3">
<name>50001802</name>
<parentOrgRef oid="2"/>
</apti:object>
<apti:object oid="7">
<name>50001742</name>
<parentOrgRef oid="6"/>
</apti:object>
<apti:object oid="1">
<name>50001282</name>
<parentOrgRef oid="0"/>
</apti:object>
</t:object>
我想使用XSLT提取每个节点的父节点的名称。
例如
<node>
<name>34567892</name>
<parent>50001282</parent>
</node>
我的XSLT是
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
xmlns:map="http://www.w3.org/2005/xpath-functions/map"
xmlns:array="http://www.w3.org/2005/xpath-functions/array"
exclude-result-prefixes="#all"
xmlns:t="http://prism.evolveum.com/xml/ns/public/types-3"
xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns:apti="http://midpoint.evolveum.com/xml/ns/public/common/api-types-3"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="html" indent="yes" html-version="5"/>
<xsl:key name="oid" match="apti:object" use="@oid"/>
<xsl:template match="apti:object[key('oid', @oid, /t:object)]">
<xsl:copy>
<xsl:apply-templates select="node(), key('oid', @oid, /t:object)!(name)"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/t:object/apti:object">
<node>
<name><xsl:value-of select="c:name"/></name>
<xsl:copy-of select="key('oid', @oid, /t:object)!(name)"/>
</node>
</xsl:template>
</xsl:stylesheet>
但是我无法获得带有模板的父节点的名称。我已经尝试搜索所有的节点,条件是有一个条件,但它似乎不工作。
请帮帮忙
发布于 2021-03-17 14:46:49
您所显示的输出类型可以很容易地使用以下方法生成:
XSLT2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns:t="http://prism.evolveum.com/xml/ns/public/types-3"
xmlns:apti="http://midpoint.evolveum.com/xml/ns/public/common/api-types-3"
exclude-result-prefixes="t apti">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="parent" match="apti:object" use="@oid" />
<xsl:template match="/t:object">
<root>
<xsl:for-each select="apti:object">
<node>
<name>
<xsl:value-of select="name"/>
</name>
<parent>
<xsl:value-of select="key('parent', parentOrgRef/ @oid)/name"/>
</parent>
</node>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
Demo:https://xsltfiddle.liberty-development.net/3MEdvi4
请注意,您的XML包含一个默认名称空间声明,该声明将所有未前缀的元素都放在名称空间中。
https://stackoverflow.com/questions/66675022
复制相似问题