我正在使用XML并尝试将其转换为另一个软件程序。 XML是通过Web服务获得的,不幸的是它没有很好的形成(因为你可以看到它甚至没有提供XML版本)。这是程序的Web服务生成的XML:
Back
基本上,它是一堆不同的元素。但是,如果没有提供数据(由生成xml的原始数据库),则会出现挑战,因此不会有任何元素。例如,如果视频ID中没有条目,则不会有视频ID元素。
我的问题是:我有没有办法1)看看元素是否存在使用xsl和2)获取相应的值?
我已经尝试过了,我似乎无法让它发挥作用:
<Metadata>
<Entry Group="SYSTEM">
<Tag>MOB ID</Tag>
<Value>060a2b340101010101010f0013-000000-55b9344b27dd00a6- 060e2b347f7f-2a80</Value>
</Entry>
<Entry Group="SYSTEM">
<Tag>Moniker</Tag>
<Value>1|F9E3A1A4-4CB9-45CC-A590-77A5D733B633|*|3055376|*</Value>
</Entry>
<Entry Group="SYSTEM">
<Tag>CFPS</Tag>
<Value>29.97</Value>
</Entry>
<Entry Group="SYSTEM">
<Tag>Created By</Tag>
<Value>rjensen</Value>
</Entry>
<Entry Group="SYSTEM">
<Tag>Creation Date</Tag>
<Value>2015-07-29T16:15:07.000-0400</Value>
</Entry>
<Entry Group="USER">
<Tag>Display Name</Tag>
<Value>LTW_NatLocal_1529_H.Sub.01.transfer</Value>
</Entry>
<Entry Group="SYSTEM">
<Tag>Duration</Tag>
<Value>00;04;13;29</Value>
</Entry>
<Entry Group="SYSTEM">
<Tag>End</Tag>
<Value>00;07;16;18</Value>
</Entry>
<Entry Group="SYSTEM">
<Tag>Media Status</Tag>
<Value>partial</Value>
</Entry>
<Entry Group="SYSTEM">
<Tag>Modified By</Tag>
<Value>rjensen</Value>
</Entry>
<Entry Group="SYSTEM">
<Tag>Modified Date</Tag>
<Value>2015-07-29T16:15:11.000-0400</Value>
</Entry>
<Entry Group="SYSTEM">
<Tag>Path</Tag>
<Value>/Sent to Playback/Week31/Wednesday/060a2b340101010101010f0013-000000-55b9344b27dd00a6-060e2b347f7f-2a80</Value>
</Entry>
<Entry Group="SYSTEM">
<Tag>Start</Tag>
<Value>00;03;02;19</Value>
</Entry>
<Entry Group="SYSTEM">
<Tag>Tracks</Tag>
<Value>V1-9 A1-2 TC1</Value>
</Entry>
<Entry Group="SYSTEM">
<Tag>Type</Tag>
<Value>sequence</Value>
</Entry>
<Entry Group="USER">
<Tag>Video ID</Tag>
<Value>test55</Value>
</Entry>
<Locator>
<Label>NK IN</Label>
<Color>Blue</Color>
<Timecode>00;03;24;17</Timecode>
<Username>jolive</Username>
<Track>V7</Track>
</Locator>
<Locator>
<Label>BUG/Phone Number/Watermark OUT</Label>
<Color>Magenta</Color>
<Timecode>00;04;01;02</Timecode>
<Username>jolive</Username>
<Track>V8</Track>
</Locator>
<Locator>
<Label>NK OUT</Label>
<Color>Blue</Color>
<Timecode>00;03;41;06</Timecode>
<Username>jolive</Username>
<Track>V7</Track>
</Locator>
<Locator>
<Label>BUG/Phone Number/Watermark IN</Label>
<Color>Magenta</Color>
<Timecode>00;04;46;13</Timecode>
<Username>jolive</Username>
<Track>V8</Track>
</Locator>
<Locator>
<Label>BUG/Phone Number/Watermark OUT</Label>
<Color>Magenta</Color>
<Timecode>00;04;30;04</Timecode>
<Username>jolive</Username>
<Track>V8</Track>
</Locator>
<Locator>
<Label>BUG/Phone Number/Watermark IN</Label>
<Color>Magenta</Color>
<Timecode>00;03;41;21</Timecode>
<Username>jolive</Username>
<Track>V8</Track>
</Locator>
</Metadata>
答案 0 :(得分:1)
看起来您正在尝试查找由{。p>创建值的<Tag>
个节点
您的test
和select
语句不是有效的XPath。那里的输入应该是这样的:
<xsl:if test="//Entry[Tag='Created By']">
基本上说“如果任何级别的任何标记节点的文本显示为'创建者',则返回true”。然后,您需要确定要选择的元素/属性 - Created By
不是属性或元素,而是元素的文本值。
我会更进一步,建议您最想要的是一个模板,以匹配Tag
的文本显示为“创建者”的节点,这可能如下所示:
<xsl:template match="Metadata/Entry[Tag='Created By']">
<xsl:value-of select="@Group" />
</xsl:template>
假设上下文为/
。