以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  关于在<xsl:if test>中进行比较的问题.  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=14178)


--  作者:lifangde125
--  发布时间:2/1/2005 5:19:00 AM

--  关于在<xsl:if test>中进行比较的问题.
我的原 xml 程序如下
<Package>
    <name>Stereotype</name>
    <OwnedElement>
        <Stereotype  xmi.id="001">
            <name>Steuerklasse</name>
    </OwnedElement>
    <OwnedElement>
        <Stereotype  xmi.id="002">
            <name>Servicesklasse</name>
    </OwnedElement>
</Package>

<Package>
    <name>Tasks</name>
    <OwnedElement>
        <class>
            <name>Stempaelanlage</name>
            <Stereotype  xmi.idref="001"/>
        </class>
        <class>
            <name>Services Stempaelanlage</name>
            <Stereotype  xmi.idref="002"/>
        </class>
    </OwnedElement>
</Package>
我想写一个xsl文件,其中将所有Stereotype是Steuerklasse的class定义为POU,
<xsl:for-each select="Package/OwnedElement/class">
  <xsl:if test="Stereotype/@xmi.idref='001'">
    <POU>
     ...........
但是我的老师说不对,不能对id进行比较,因为这个id的数字不是固定的,但是有一点是固定的,就是第二个Package 中Stereotype的xmi.idref一定是指第一个Package中相对应的Stereotype的id,也就是说我的class Stempelanlage的Stereotype是Steuerklasse, class Services Stempelanlage 的Stereotype是Servicesklasse.
那我该怎么写才对呢?


--  作者:doubleG
--  发布时间:2/1/2005 9:45:00 AM

--  
可以这样:
<xsl:variable name="stererotype" select="Package/OwnedElement/Stereotype[name='Steuerklasse']/@xmi.id"/>
<xsl:for-each select="Package/OwnedElement/class">
  <xsl:if test="Stereotype/@xmi.idref=$stererotype">
    <POU>
     ...........

--  作者:lifangde125
--  发布时间:2/1/2005 6:33:00 PM

--  
very good, thank you!!
--  作者:lifangde125
--  发布时间:2/2/2005 5:49:00 AM

--  
能继续问一下吗?在原xml文件中我还有一个package
<package3 xmi.id="100">
  <name>Zustanddiagramm</name>
  <statemachine xmi.id="101">
    <name>anlauf</name>
    <statemachine.top>
      <Psendostate xmi.id="102"/>
    </statemachine.top>
  </statemachine>
  <statemachine xmi.id="103">
    <name>Stempelanlage</name>
    <statemachine.top>
      <Psendostate xmi.id="104"/>
    </statemachine.top>
  </statemachine>
</package3>
上面的第二个Package稍作改动
<Package2>
    <name>Tasks</name>
    <OwnedElement>
        <class>
            <name>Stempelanlage</name>
            <Stereotype  xmi.idref="001"/>
            <behavior xmi.idref="103"/>
        </class>
        <class>
            <name>Services Stempaelanlage</name>
            <Stereotype  xmi.idref="002"/>
        </class>
    </OwnedElement>
</Package2>

在xslt中照你写的
<xsl:variable name="stererotype" select="Package/OwnedElement/Stereotype[name='Steuerklasse']/@xmi.id"/>
<xsl:for-each select="Package/OwnedElement/class">
  <xsl:if test="Stereotype/@xmi.idref=$stererotype">
    <POU>
        <xsl:for-each select="package/statemachine/statemachine.tpo/Psendostate">  
          <step>
             <xsl:attribute name="name">start</xsl:attribute>
          </step>
        </xsl:for-each>
        .........
我得到的输出中,Stempelanlage有两个step"start",我只希望将Stempelanlage自己的Psendostate定义成step,我能对Package3中<statemachine xmi.id>和Package2中class的<behavior xmi.idref>进行比较吗?如果相等就输出<Psendostate>?
我用上面的方法试过,还是不对.


--  作者:doubleG
--  发布时间:2/2/2005 12:11:00 PM

--  
你是要只改Stereotype/@xmi.idref=$stererotype所对应的class吗?最好这样,你把你的源文件和想要的结果文件写出来才知道你到底想要怎样的结果,不然可能中间会有误解的。
<xsl:for-each select="package/statemachine/statemachine.tpo/Psendostate">  这样的for-each循环当然会造成两个了,因为你没有任何条件限制。
--  作者:lifangde125
--  发布时间:2/2/2005 5:31:00 PM

--  
pou     Stempelanlage(class Stempelanlage with Stereotype "Steuerklasse")
step    start(this start belong to statemachine "Stempelanlage")
--  作者:lifangde125
--  发布时间:2/2/2005 9:07:00 PM

--  
问题已经解决了,谢谢
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
62.500ms