我有 XML :
<TreeView>
<Parent text="Installation">
<child company="all" text="Startup" type="video" file="startup.mp4"/>
<child company="all" text="Getting there" type="video" file="small.mp4"/>
<child company="all" text="Steps" type="pdf_document" file="test.pdf"/>
<child company="all" text="Pictures" type="presentation" file="pics.ppx"/>
</Parent>
<Parent text="Usage">
<child company="B" text="Tilbud pane" type="video" file="b1.mp4"/>
<child company="B" text="Report pane" type="pdf_document" file="b2.pdf"/>
<child company="N" text="Tilbud pane" type="video" file="n1.mp4"/>
<child company="N" text="Report pane" type="pdf_document" file="n2.pdf"/>
<child company="D" text="Tilbud pane" type="video" file="d1.mp4"/>
<child company="D" text="Report pane" type="pdf_document" file="d2.pdf"/>
</Parent>
</TreeView>
到目前为止 XSLT :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8"/>
<xsl:template match="/">
<ul id="LinkedList1" class="LinkedList">
<xsl:apply-templates/>
</ul>
</xsl:template>
<xsl:template match="Parent">
<li>
<xsl:value-of select="@text"/>
<br/>
<ul>
<xsl:apply-templates select="child"/>
</ul>
</li>
</xsl:template>
<xsl:template match="child[@type='video']">
<li>
<a href="{@file}" class="video">
<img src="play_icon.png" alt="video" title="Video tutorial"/>
<xsl:text> </xsl:text>
<xsl:value-of select="@text"/>
</a>
</li>
</xsl:template>
<xsl:template match="child[@type='pdf_document']">
<li>
<a href="{@file}" class="pdfdoc">
<img src="pdf_icon.png" alt="pdfdoc" title="PDF Document"/>
<xsl:text> </xsl:text>
<xsl:value-of select="@text"/>
</a>
</li>
</xsl:template>
<xsl:template match="child[@type='presentation']">
<li><a href="{@file}" class="presentation">
<img src="powerpoint_icon.png" alt="presentation" title="Power Point presentation"/>
<xsl:text> </xsl:text>
<xsl:value-of select="@text"/>
</a>
</li>
</xsl:template>
</xsl:stylesheet>
它正如预期的那样完美运行,但我想为转换添加一个功能。我希望,根据 company 属性的值,包含整个元素,或者跳过它。
详细说明:公司属性值为“all”的子元素必须始终包含在已转换的文件中。之后,只有具有 company 属性值“B”的子元素的其余部分才应该被分组。然后我将为不同的公司提供3种不同的XSL文件。所以我现在只需要为一家公司提供XSL代码。
我不确定是否必须以某种方式使用条件语句或模板。我只是被窃听,因为我的XSL文件对我来说有点复杂。
如果有人可以根据我的要求添加现有代码 - 我们将不胜感激。
答案 0 :(得分:1)
所以如果我使用这个源XML:
<TreeView>
<Parent text="Installation">
<child company="all" text="Startup" type="video" file="startup.mp4"/>
<child company="all" text="Getting there" type="video" file="small.mp4"/>
<child company="all" text="Steps" type="pdf_document" file="test.pdf"/>
<child company="all" text="Pictures" type="presentation" file="pics.ppx"/>
</Parent>
<Parent text="Usage">
<child company="B" text="Tilbud pane" type="video" file="b1.mp4"/>
<child company="B" text="Report pane" type="pdf_document" file="b2.pdf"/>
<child company="N" text="Tilbud pane" type="video" file="n1.mp4"/>
<child company="N" text="Report pane" type="pdf_document" file="n2.pdf"/>
<child company="D" text="Tilbud pane" type="video" file="d1.mp4"/>
<child company="D" text="Report pane" type="pdf_document" file="d2.pdf"/>
</Parent>
并应用此XSLT:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<ul id="LinkedList1" class="LinkedList">
<xsl:apply-templates/>
</ul>
</xsl:template>
<xsl:template match="Parent">
<li>
<xsl:value-of select="@text"/>
<br />
<ul>
<xsl:apply-templates select="child[@company='all' or @company='B']"/>
</ul>
</li>
</xsl:template>
<xsl:template match="child[@type='video']">
<li>
<a href="{@file}" class="video">
<img src="play_icon.png" alt="video" title="Video tutorial">
<xsl:text> </xsl:text>
<xsl:value-of select="@text"/>
</img>
</a>
</li>
</xsl:template>
<xsl:template match="child[@type='pdf_document']">
<li>
<a href="{@file}" class="pdfdoc">
<img src="pdf_icon.png" alt="pdfdoc" title="PDF Document">
<xsl:text> </xsl:text>
<xsl:value-of select="@text"/>
</img>
</a>
</li>
</xsl:template>
<xsl:template match="child[@type='presentation']">
<li>
<a href="{@file}" class="presentation">
<img src="powerpoint_icon.png" alt="presentation" title="Power Point presentation">
<xsl:text> </xsl:text>
<xsl:value-of select="@text"/>
</img>
</a>
</li>
</xsl:template>
</xsl:stylesheet>
你得到这个输出:
<ul class="LinkedList" id="LinkedList1">
<li>Installation<br/>
<ul>
<li>
<a class="video" href="startup.mp4">
<img title="Video tutorial" alt="video" src="play_icon.png"> Startup</img>
</a>
</li>
<li>
<a class="video" href="small.mp4">
<img title="Video tutorial" alt="video" src="play_icon.png"> Getting there</img>
</a>
</li>
<li>
<a class="pdfdoc" href="test.pdf">
<img title="PDF Document" alt="pdfdoc" src="pdf_icon.png"> Steps</img>
</a>
</li>
<li>
<a class="presentation" href="pics.ppx">
<img title="Power Point presentation" alt="presentation"
src="powerpoint_icon.png"> Pictures</img>
</a>
</li>
</ul>
</li>
<li>Usage<br/>
<ul>
<li>
<a class="video" href="b1.mp4">
<img title="Video tutorial" alt="video" src="play_icon.png"> Tilbud pane</img>
</a>
</li>
<li>
<a class="pdfdoc" href="b2.pdf">
<img title="PDF Document" alt="pdfdoc" src="pdf_icon.png"> Report pane</img>
</a>
</li>
</ul>
</li>
</ul>
考虑样式表中的<xsl:output indent="yes" omit-xml-declaration="yes"/>
。在原始样式表中,您output=html
会导致<br/>
元素“松散”结束标记。
我希望输出符合您的预期。
祝你好运, 彼得