我有以下 XML 表示視頻串列(標題)和使用這些視頻(時鐘)的播放串列:
<?xml version="1.0" encoding="UTF-8"?>
<myXML>
<Titles>
<Title>
<name>Video1</name>
<duration>200</duration>
</Title>
<Title>
<name>Video2</name>
<duration>300</duration>
</Title>
<Title>
<name>Video3</name>
<duration>100</duration>
</Title>
</Titles>
<Clock>
<Video>
<name>Video3</name>
</Video>
<Video>
<name>Video1</name>
</Video>
<Video>
<name>Video3</name>
</Video>
<Video>
<name>Video2</name>
</Video>
</Clock>
</myXML>
我想使用 XSLT 創建一個具有相同順序和每個視頻開始時間的新 XML 播放串列(假設時鐘中的第一個視頻從時間 0 開始)。如您所見,一個視頻可以在播放串列中播放多次(此處 Video3 播放了兩次)。
我試過這個:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<Playlist>
<xsl:for-each select="myXML/Clock/Video">
<Video>
<name><xsl:value-of select="name"/></name>
<start_time><xsl:value-of select="sum(/myXML/Titles/Title[name=current()/preceding-sibling::*/name]/duration)" /></start_time>
</Video>
</xsl:for-each>
</Playlist>
</xsl:template>
</xsl:stylesheet>
這個想法是,對于時鐘中的每個視頻,使用連接操作“[name=current()/preceding-sibling:計算時鐘中前面視頻的持續時間總和,這將是視頻的開始時間: :*/姓名]”。但它不起作用,因為如果一個視頻在時鐘中播放兩次(或多次),它只會在總和中計算一次。此解決方案的 XML 輸出是:
<?xml version="1.0" encoding="UTF-8"?>
<Playlist>
<Video>
<name>Video3</name>
<start_time>0</start_time>
</Video>
<Video>
<name>Video1</name>
<start_time>100</start_time></Video>
<Video>
<name>Video3</name>
<start_time>300</start_time></Video>
<Video>
<name>Video2</name>
<start_time>300</start_time></Video>
</Playlist>
而 Video2 的 start_time 應該是 400。
我嘗試操作 XSLT,但沒有找到令人滿意的解決方案。由于 XSLT 中缺少可變變數,我感到卡住了。你知道如何實作這一目標嗎?歡迎任何幫助,謝謝。
uj5u.com熱心網友回復:
這是您可以查看它的一種方式:
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:key name="title" match="Title" use="name" />
<xsl:template match="/myXML">
<Playlist>
<xsl:call-template name="build-list">
<xsl:with-param name="items" select="Clock/Video"/>
</xsl:call-template>
</Playlist>
</xsl:template>
<xsl:template name="build-list">
<xsl:param name="items"/>
<xsl:param name="start" select="0"/>
<xsl:if test="$items">
<xsl:variable name="name" select="$items[1]/name" />
<Video>
<xsl:copy-of select="$name"/>
<start_time>
<xsl:value-of select="$start" />
</start_time>
</Video>
<!-- recursive call -->
<xsl:call-template name="build-list">
<xsl:with-param name="items" select="$items[position() > 1]"/>
<xsl:with-param name="start" select="$start key('title', $name)/duration"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
另一種選擇是使用所謂的“兄弟遞回”(查找)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/336002.html
