【发布时间】:2018-05-26 10:31:26
【问题描述】:
总的来说,我在 XSLT 和 XML 方面相对较新。 我正在尝试能够转换具有如下部分的 XML 文件:
<messageTypes>
<id>EOL</id>
<Headline>this is the headline of a message
</Headline>
<Description>1. This is the description of a message</Description>
<infoTable>
<fieldName>EOL</fieldName>
<DTLink>
<DTLinkL>string(3)</DTLinkL>
<DTLinkT>string(3)</DTLinkT>
</DTLink>
<fieldSize>1</fieldSize>
<fieldValue>0x42</fieldValue>
<descriptionWithLink>
<Description>it's the end of the world as we know it</Description>
<XLink>
<XLinkL>https://stackoverflow.com/questions/13780145/inserting-images-from-xml-to-xsl-document
</XLinkL>
<XLinkT>here's a link for ye</XLinkT>
</XLink>
<SLink>
<SLinkL>header</SLinkL>
<SLinkT>This is also like this type of structure header</SLinkT>
</SLink>
</descriptionWithLink>
</infoTable>
<optionalElement id="Choice 1">
<fieldName>option A</fieldName>
<DTLink>
<DTLinkL>string(4)</DTLinkL>
<DTLinkT>string(4)</DTLinkT>
</DTLink>
<fieldSize>1</fieldSize>
<fieldValue>0xdeadbeef</fieldValue>
<descriptionWithLink>
<Description>dead beef is dead beef</Description>
<XLink>
<XLinkL>https://stackoverflow.com/questions/13780145/inserting-images-from-xml-to-xsl-document
</XLinkL>
<XLinkT>here's a link for ye</XLinkT>
</XLink>
</descriptionWithLink>
</optionalElement>
<infoTable>
<fieldName>EOL</fieldName>
<DTLink>
<DTLinkL>string(2)</DTLinkL>
<DTLinkT>string(2)</DTLinkT>
</DTLink>
<fieldSize>1</fieldSize>
<fieldValue>0x42</fieldValue>
<descriptionWithLink>
<Description>it's the end of the world as we know it</Description>
<XLink>
<XLinkL>https://stackoverflow.com/questions/13780145/inserting-images-from-xml-to-xsl-document
</XLinkL>
<XLinkT>here's a link for ye</XLinkT>
</XLink>
<SLink>
<SLinkL>middle</SLinkL>
<SLinkT>This is also like this type of structure middle</SLinkT>
</SLink>
</descriptionWithLink>
</infoTable>
对于能够表达这一点的东西:
表格部分的“如果”分解,以便 1. 您可以在这里拥有一个元素(这将导致更常见的消息类型)或另一个元素(这将导致不同但更罕见的元素类型)。 2. 请注意,OptionalElement 中详述的可能部分并不常见,但可能会发生。
我构建的 XSL 如下所示:
<h1>Messages</h1>
<xsl:for-each
select="m:SectionMessageTypes/m:messageTypes">
<xsl:variable name="MessageID" select="m:id" />
<h3 id="{$MessageID}">
<xsl:value-of select="m:Headline" />
</h3>
<p>
<xsl:value-of select="m:Description" />
</p>
<table width="80%" border="2" cellpadding="5">
<tr bgcolor="#87CEFA">
<td>Name</td>
<td>Type</td>
<td>Size</td>
<td>Value</td>
<td>Description</td>
</tr>
<xsl:for-each select="m:infoTable">
<xsl:variable name="MessageID" select="m:id" />
<tr>
<xsl:choose>
<xsl:when test="m:fieldName='header'">
<td>
<a href="#header">Header</a>
</td>
</xsl:when>
<xsl:otherwise>
<td>
<xsl:value-of select="m:fieldName" />
</td>
</xsl:otherwise>
</xsl:choose>
<td>
<xsl:variable name="DTLinkV"
select="m:DTLink/m:DTLinkL" />
<a href="#{$DTLinkV}">
<xsl:value-of select="m:DTLink/m:DTLinkT" />
</a>
</td>
<td>
<xsl:value-of select="m:fieldSize" />
</td>
<td>
<xsl:value-of select="m:fieldValue" />
</td>
<td>
<xsl:value-of
select="m:descriptionWithLink/m:Description" />
<br />
<xsl:if test="m:descriptionWithLink/m:XLink">
<xsl:variable name="XLinkV"
select="m:descriptionWithLink/m:XLink/m:XLinkL" />
<a href="{$XLinkV}">
<xsl:value-of
select="m:descriptionWithLink/m:XLink/m:XLinkT" />
</a>
<br />
</xsl:if>
<xsl:if test="m:descriptionWithLink/m:DLink">
<xsl:variable name="DLinkV"
select="m:descriptionWithLink/m:DLink/m:DLinkL" />
<a href="#{$DLinkV}">
<xsl:value-of
select="m:descriptionWithLink/m:DLink/m:DLinkT" />
</a>
<br />
</xsl:if>
<xsl:if test="m:descriptionWithLink/m:MLink">
<xsl:variable name="MLinkV"
select="m:descriptionWithLink/m:MLink/m:MLinkL" />
<a href="#{$MLinkV}">
<xsl:value-of
select="m:descriptionWithLink/m:MLink/m:MLinkT" />
</a>
<br />
</xsl:if>
<xsl:if test="m:descriptionWithLink/m:DTLink">
<xsl:variable name="DTLinkV"
select="m:descriptionWithLink/m:DTLink/m:DTLinkL" />
<a href="#{$DTLinkV}">
<xsl:value-of
select="m:descriptionWithLink/m:DTLink/m:DTLinkT" />
</a>
<br />
</xsl:if>
<xsl:if test="m:descriptionWithLink/m:SLink">
<xsl:variable name="SLinkV"
select="m:descriptionWithLink/m:SLink/m:SLinkL" />
<a href="#{$SLinkV}">
<xsl:value-of
select="m:descriptionWithLink/m:SLink/m:SLinkT" />
</a>
<br />
</xsl:if>
</td>
</tr>
</xsl:for-each>
</table>
<table width="80%" border="2" cellpadding="5">
<tr bgcolor="#E0FFFF">
<td>Name</td>
<td>Type</td>
<td>Size</td>
<td>Value</td>
<td>Description</td>
</tr>
<xsl:for-each select="m:optionalElement">
<tr>
<img src="./Flowchart_condition_symbol.svg.png" width="42"
height="42" />
<xsl:value-of select="@id" />
</tr>
<tr>
<xsl:choose>
<xsl:when test="m:fieldName='header'">
<td>
<a href="#header">Header</a>
</td>
</xsl:when>
<xsl:otherwise>
<td>
<xsl:value-of select="m:fieldName" />
</td>
</xsl:otherwise>
</xsl:choose>
<td>
<xsl:variable name="DTLinkV"
select="m:DTLink/m:DTLinkL" />
<a href="#{$DTLinkV}">
<xsl:value-of select="m:DTLink/m:DTLinkT" />
</a>
</td>
<td>
<xsl:value-of select="m:fieldSize" />
</td>
<td>
<xsl:value-of select="m:fieldValue" />
</td>
<td>
<xsl:value-of
select="m:descriptionWithLink/m:Description" />
<br />
<xsl:if test="m:descriptionWithLink/m:XLink">
<xsl:variable name="XLinkV"
select="m:descriptionWithLink/m:XLink/m:XLinkL" />
<a href="{$XLinkV}">
<xsl:value-of
select="m:descriptionWithLink/m:XLink/m:XLinkT" />
</a>
<br />
</xsl:if>
<xsl:if test="m:descriptionWithLink/m:DLink">
<xsl:variable name="DLinkV"
select="m:descriptionWithLink/m:DLink/m:DLinkL" />
<a href="#{$DLinkV}">
<xsl:value-of
select="m:descriptionWithLink/m:DLink/m:DLinkT" />
</a>
<br />
</xsl:if>
<xsl:if test="m:descriptionWithLink/m:MLink">
<xsl:variable name="MLinkV"
select="m:descriptionWithLink/m:MLink/m:MLinkL" />
<a href="#{$MLinkV}">
<xsl:value-of
select="m:descriptionWithLink/m:MLink/m:MLinkT" />
</a>
<br />
</xsl:if>
<xsl:if test="m:descriptionWithLink/m:DTLink">
<xsl:variable name="DTLinkV"
select="m:descriptionWithLink/m:DTLink/m:DTLinkL" />
<a href="#{$DTLinkV}">
<xsl:value-of
select="m:descriptionWithLink/m:DTLink/m:DTLinkT" />
</a>
<br />
</xsl:if>
<xsl:if test="m:descriptionWithLink/m:SLink">
<xsl:variable name="SLinkV"
select="m:descriptionWithLink/m:SLink/m:SLinkL" />
<a href="#{$SLinkV}">
<xsl:value-of
select="m:descriptionWithLink/m:SLink/m:SLinkT" />
</a>
<br />
</xsl:if>
</td>
</tr>
</xsl:for-each>
</table>
如您所见....OptionalElement 不会出现在两个 InfoTable 元素之间。
有没有非css的方式来做到这一点?
这是一个工作项目,恐怕我还没有时间进入 CSS 领域。
【问题讨论】: