使用XSLT在XML中隐藏字段的正确代码是什么?

时间:2014-10-10 09:24:03

标签: xml xslt xml-parsing show-hide

如果未使用XML和XSLT选择spinner中的选项,如何隐藏其他字段?

E.g我有一个带有三个选项的微调器

Option 1: Form 1
Option 2: Form 2
Option 3: Others

如果用户选择选项1,将显示选项1下的所有字段,而选项2下的字段为隐藏(反之亦然)

这是对的吗?

 <xsl:template match="/">
    <xsl:apply-templates select="Form/Field">   
    <xsl:variable name="Category" select="Spinner"/>
        <select id="Form">
            <xsl:for-each select="$Item">
                <xsl: value="{.}">
                    <xsl:attribute name="type"/>
                </xsl:if>
                <xsl:value-of select="."/>
</xsl:template>

XML:

<Field name="Category" type="Spinner" label="Please choose">
    <Item code="CashPickupForm" label="Cash Pickup"/>
    <Item code="HomeVisitForm" label="Home Visit"/>
    <Item code="OtherForm" label="Others"/>
</Field>

这里有一些Form 1的XML

<Form name="CashPickup"
  type="TextView"
  label="Cash Pick-up Form">

<Field name="ContractNumber" type="TextView" label="Contract number" value=""/>
<Field name="ClientName" type="TextView" label="Client Name" value=""/>
<Field type="Delimiter"/>

XSL:

  <xsl:template match="/">
<xsl:apply-templates select="Form"/>
</xsl:template>

<xsl:template match="Form">
<xsl:element name="Form">
  <xsl:attribute name="name">
    <xsl:value-of select="@name"/>
  </xsl:attribute>
  <xsl:attribute name="type">
    <xsl:value-of select="@type"/>
  </xsl:attribute>
  <xsl:attribute name="label">
    <xsl:value-of select="@label"/>
  </xsl:attribute>
  <xsl:copy-of select="namespace::*[not(name()='ns2') and not(name()='')]"/>
  <xsl:call-template  name="Arrange"/>
</xsl:element>
</xsl:template>

<xsl:template name="Arrange">

<xsl:apply-templates select="Field[@name='ContractNumber']"/>
<xsl:apply-templates select="Field[@name='ClientName']"/>
<Field type="Delimiter"/>

XML表单2:

<Form name="HomeVisitForm"
  type="TextView"
  label="Home Visit Form">

<Field name="ContractNumber" type="TextView" label="Application number" value=""/>
<Field name="TypeCheck" type="TextView" label="Type of check" value=""/>
<Field type="Delimiter"/>

XSL:

<xsl:template match="/">
<xsl:apply-templates select="Form"/>
</xsl:template>

<xsl:template match="Form">
<xsl:element name="Form">
  <xsl:attribute name="name">
    <xsl:value-of select="@name"/>
  </xsl:attribute>
  <xsl:attribute name="type">
    <xsl:value-of select="@type"/>
  </xsl:attribute>
  <xsl:attribute name="label">
    <xsl:value-of select="@label"/>
  </xsl:attribute>
  <xsl:copy-of select="namespace::*[not(name()='ns2') and not(name()='')]"/>
  <xsl:call-template  name="Arrange"/>
 </xsl:element>
</xsl:template>

<xsl:template name="Arrange">

<xsl:apply-templates select="Field[@name='ContractNumber']"/>
<xsl:apply-templates select="Field[@name='TypeCheck']"/>
<Field type="Delimiter"/>

1 个答案:

答案 0 :(得分:1)

假设您将一个名为FormType的参数传递给包含值12的XSLT(作为一个开头,以及稍后可能的其他值),您可以增强您的XSLT以下方式:

...
<xsl:parameter name="FormType"/>
...
<xsl:template match="/">
  <xsl:apply-templates select="Form"/>
</xsl:template>

<xsl:template match="Form">
  <Form name="{@name}" 
        type="{@type}"
        label="{@label}">
    <xsl:copy-of select="namespace::*[not(name()='ns2') and not(name()='')]"/>
    <xsl:call-template name="Arrange"/>
  </Form>
</xsl:template>

<xsl:template name="Arrange">

  <xsl:apply-templates select="Field[@name='ContractNumber']"/>

  <xsl:if test="$FormType = '1'">
    <xsl:apply-templates select="Field[@name='ClientName']"/>
    <!-- you may put more fields here if applicable-->
  </xsl:if>

  <xsl:if test="$FormType = '2'">
    <xsl:apply-templates select="Field[@name='TypeCheck']"/>
  </xsl:if>
  ...
  <!-- you may put more if blocks here if applicable -->
  ...
  <Field type="Delimiter"/>
  ...
</xsl:template>

注意:

  • 我使用简单的HTML标记简化了您的<xsl:element>代码。
  • 这只是一个字段的示例。如果需要,您可能需要添加更多<xsl:if>代码。
  • 如果订单正确,您可以将多个字段放入一个<xsl:if>块中。