我的树结构中的xml文件就像这个final.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="b.xsl"?>
<childrens>
<child_1 entity_id="1" value="Root Catalog" parent_id="0">
<child_2 entity_id="2" value="Navigate" parent_id="1">
<child_4 entity_id="4" value="Activities" parent_id="2">
<child_10066 entity_id="10066" value="Physical1" parent_id="4">
<child_10067 entity_id="10067" value="Cricket" parent_id="10066">
<child_10068 entity_id="10068" value="One Day" parent_id="10067"/>
</child_10067>
</child_10066>
<child_10069 entity_id="10069" value="Test2" parent_id="4"/>
<child_10070 entity_id="10070" value="Test3" parent_id="4"/>
<child_10071 entity_id="10071" value="Test4" parent_id="4"/>
<child_10072 entity_id="10072" value="Test5" parent_id="4"/>
<child_5 entity_id="5" value="Physical" parent_id="4"/>
</child_4>
<child_4331 entity_id="4331" value="Region" parent_id="2">
.
.
.
.
</child_4331>
</child_2>
</child_1>
</childrens>
这是我的xslt代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="*" mode="item">
<li>
<xsl:value-of select="@value"/>
<xsl:apply-templates select="current()[*]"/>
</li>
</xsl:template>
<xsl:template match="*/*/*">
<ul>
<xsl:apply-templates select="*[1] | node()[current()/ancestor::*[3]]" mode="item"/>
<xsl:if test="local-name(child::*) = 'child_4'"><div id="Activity"></div></xsl:if>
</ul>
</xsl:template>
</xsl:stylesheet>
我有另一个xml文件,其中包含叶节点的id
我想只显示filter.xml
文件(其父ID)
并且filter.xml是
<products>
<product_id value="1">
<tab_id value="351">
<tab_name value="test1"/>
<dist_activity value="5"/>
<dist_activity value="10068"/>
<dist_activity value="10070"/>
</tab_id>
</product_id>
<product_id value="2">
<tab_id value="352">
<tab_name value="test2"/>
<dist_activity value="10069"/>
</tab_id>
</product_id>
</products>
这里dist_activity包含叶节点的id,它是main xml文件中的entity_id,所以我想要使用这个2 xml文件输出。目前我只使用主xml文件而不是filter.xml
文件这里是我当前的输出和输出我想要使用这两个文件
这里是filter.xml中的一天(10068),Test2(10069),test3(10070),Physical(5)所以我只想要我树上的那些
所以我需要在我的xslt
代码
答案 0 :(得分:1)
对于我来说,过滤器应该如何工作并不完全清楚。从你的陈述:
这里是filter.xml中的一天(10068),Test2(10069),test3(10070),Physical(5)所以我只想要那些在我的树中
和我期望的filter.xml:
您希望在输出中为child_xxxx元素添加li
元素,其中self或后代的entity_id在filter.xml中作为dist_activity的@value存在。
因此,请尝试对您的xlst进行这一小改动:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" omit-xml-declaration="yes"/>
<xsl:variable name="filter" select="document('iz1_filter.xml')"/>
<xsl:template match="*" mode="item">
<xsl:if test="$filter//dist_activity[@value= current()/descendant-or-self::*/@entity_id ]" >
<li>
<xsl:value-of select="@value"/>
<xsl:apply-templates select="current()[*]"/>
</li>
</xsl:if>
</xsl:template>
<xsl:template match="*/*/*">
<ul>
<xsl:apply-templates select="*[1] | node()[current()/ancestor::*[3]]" mode="item"/>
<xsl:if test="local-name(child::*) = 'child_4'">
<div id="Activity"></div>
</xsl:if>
</ul>
</xsl:template>
</xsl:stylesheet>
将生成以下输出:
<ul>
<li>
Activities<ul>
<li>
Physical1<ul>
<li>
Cricket<ul>
<li>One Day</li>
</ul>
</li>
</ul>
</li>
<li>Test2</li>
<li>Test3</li>
<li>Physical</li>
</ul>
</li>
<div id="Activity"></div>
</ul>
答案 1 :(得分:0)
node()[current()/ancestor::*[3]]
选择具有至少三个祖先的所有子节点。由于当前节点有两个父节点,所以它的所有子节点都有三个祖先,保证。
如果您想选择只有三个兄弟姐妹的人,请尝试preceding-sibling
轴,而不是ancestor
轴。