URL的XSL包装方法

时间:2015-04-30 03:27:21

标签: xml xslt xslt-1.0

抱歉,我没有更好的标题,如果我能想到一个更好的方式来说出来,我可能会找到答案: - /

我有一些看起来像

的XML数据
<maml:navigationLink>
    <maml:linkText>some text</maml:linkText>
    <maml:uri />
</maml:navigationLink>

现在在某些情况下,URI是空的,而在其他情况下则不是。如果有URI,则我想将其设为链接,否则只是文本。

我知道我可以使用像这样的选择

<xsl:choose>
  <xsl:when test="maml:uri !=''">
    <a href="{maml:uri}"><xsl:value-of select="maml:linkText"/></a>
  </xsl:when>
  <xsl:otherwise>
    <xsl:value-of select="maml:linkText"/>
  </xsl:otherwise>
</xsl:choose>

但是我有另一个更复杂的情况,它需要相同的是/否包装,只是它会有一些深度,这会使它更复杂。

更复杂的例子就像是

<parameter required='true'  position='true'>
  <maml:name>Name</maml:name>
  <maml:type>String</maml:type>
</parameter>

我需要结果看起来像

[[-Name] <String>]

最外面的[]是&#34;必需的&#34;标志,内部[]是否是&#39;位置&#39;是真的。

这甚至是对它的全部范围的简化,但这足以显示它的嵌套方面。

做类似的事情是否有某种捷径?

1 个答案:

答案 0 :(得分:0)

这是我提出的方法,使用变量和更详细的XML来处理。

这是XML

<command:parameter required="false" variableLength="true" globbing="true" pipelineInput="True (ByPropertyName)" position="1" aliases="ProcessName">
      <maml:name>Name</maml:name>
      <maml:description>
        <maml:para>Specifies one or more processes by process name. You can type multiple process names (separated by commas) and use wildcard characters. The parameter name ("Name") is optional.</maml:para>
      </maml:description>
      <command:parameterValue required="true" variableLength="true">String[]      </command:parameterValue>
    </command:parameter>

这是我提出的解决方案。

  <xsl:template match="command:parameter" mode="syntax">
    <xsl:variable name="pName">
      <xsl:choose>
        <xsl:when test="@position !='named'">
          <xsl:value-of select="concat('[-',maml:name,']')"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="concat('-',maml:name)"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>

    <xsl:variable name="pType">
        <xsl:if test="command:parameterValue !=''">
          <xsl:value-of select="concat(' &lt;', command:parameterValue,'>')"/>
        </xsl:if>
    </xsl:variable>

    <xsl:choose>
      <xsl:when test="@required ='true'">
        <xsl:value-of select="concat(' ',$pName,$pType)"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="concat(' [',$pName,$pType,'] ')"/>
      </xsl:otherwise>
    </xsl:choose>

  </xsl:template>

输出看起来像这样

Get-Process [[-Name] <String[]>]  [-ComputerName <String[]>]  [-FileVersionInfo]  [-Module]  [<CommonParameters>]

对于这种更嵌套的情况,该变量是有意义的,但对于URL,如果我使用变量,那么它的代码就差不多了。