为什么逗号在为每个嵌套的XSL中不能按预期工作



TL;DR-问题:在嵌套的for-each中,我无法获得正确打印的逗号。有四种情况不断重复。我还可以想出其他方法来完成这项工作,但我真的想知道为什么会这样。

问题:为什么管道可以工作,但逗号不能工作,为什么最后一个元素有时会自己打印出来?

概述:我正在尝试将包含节点关系的XML文档转换为JSON格式,以便进行图形可视化。有几种方法可以解决这个问题,我选择了从生成节点列表开始。因此,我有一个XSL文件,它将XML文档转换为节点的JSON树结构。

以下是XML文件的一个片段:

<?xml version="1.0" ?>
<knowledge_base
  xmlns="http://protege.stanford.edu/xml"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://protege.stanford.edu/xml http://www.enterprise-architecture.org/xml/essentialreportxml.xsd">
  <simple_instance>
    <name>Class181</name>
    <type>Business_Capability</type>
    <own_slot_value>
      <slot_reference>business_capability_level</slot_reference>
      <value value_type="string">3</value>
    </own_slot_value>
    <own_slot_value>
      <slot_reference>realised_by_business_processes</slot_reference>
      <value value_type="simple_instance">Class40041</value>
    </own_slot_value>
    <own_slot_value>
      <slot_reference>supports_business_capabilities</slot_reference>
      <value value_type="simple_instance">Class180</value>
      <value value_type="simple_instance">Class20022</value>
      <value value_type="simple_instance">Class182</value>
    </own_slot_value>
    <own_slot_value>
      <slot_reference>name</slot_reference>
      <value value_type="string">Help Desk Service</value>
    </own_slot_value>
  </simple_instance>
</knowledge_base>

有多种业务能力,他们可以作为父母拥有业务能力,也可以作为子女拥有其他业务能力。这是我的XSL文档的大部分:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xpath-default-namespace="http://protege.stanford.edu/xml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:xalan="http://xml.apache.org/xslt" xmlns:pro="http://protege.stanford.edu/xml" xmlns:eas="http://www.enterprise-architecture.org/essential" xmlns:functx="http://www.functx.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ess="http://www.enterprise-architecture.org/essential/errorview">
  <xsl:template match="knowledge_base">
        <xsl:call-template name="BuildPage"/>
  </xsl:template>
  <xsl:template name="BuildPage">
    <xsl:param name="pageLabel">Business Capability Graph</xsl:param>
    <html>
      <head>
        <title><xsl:value-of select="$pageLabel"></xsl:value-of></title>
        <script src="js/d3.v3.min.js"></script>
        <script type="text/javascript">
          <xsl:text>
          function tree()
            {
            var json=</xsl:text><xsl:call-template name="getJSON" /><xsl:text>;
            console.log(JSON.stringify(json));
            }
        </xsl:text>
        </script>
        </head>
        <body onload="tree();">
          <div id="main"></div>
        </body>
        </html>
  </xsl:template>
  <xsl:template name="getJSON">
    <xsl:text>{ "nodes" : [</xsl:text>
    <!-- Get Business Caps -->
    <xsl:call-template name="getNodes">
      <xsl:with-param name="nodes" select="/node()/simple_instance[type='Business_Capability']" />
    </xsl:call-template>
    <xsl:text>]}</xsl:text>
  </xsl:template>
  <xsl:template name="getNodes">
    <xsl:param name="nodes" />
    <xsl:for-each select="$nodes">
      <xsl:variable name="name" select="own_slot_value[slot_reference='name']/value" />
      <xsl:variable name="id" select="current()/name" />
      <xsl:variable name="level" select="own_slot_value[slot_reference='business_capability_level']/value" />
      <xsl:text>{"name":"</xsl:text><xsl:value-of select="$name" />
      <xsl:text>", "id":"</xsl:text><xsl:value-of select="$id" />
      <xsl:text>", "level":"</xsl:text><xsl:value-of select="$level" />
      <xsl:text>", "data":{</xsl:text>
      <xsl:variable name="pcCap_list" select="own_slot_value[slot_reference='supports_business_capabilities']" />
      <xsl:text>"pcCap":{</xsl:text>
      <xsl:for-each select="/node()/simple_instance[name=$pcCap_list/value]" >
          <xsl:variable name="pos" select="position()" />
              <xsl:text>"id" : "</xsl:text>
              <xsl:value-of select="name" />
              <xsl:text> - pos </xsl:text><xsl:value-of select="$pos" />
              <xsl:text> - count </xsl:text><xsl:value-of select="count($pcCap_list/value)" />
              <xsl:text>"</xsl:text>
      </xsl:for-each>
      <xsl:text>}}}</xsl:text>
      <xsl:if test="position() != count($nodes)">
        <xsl:text>, </xsl:text>
      </xsl:if>
    </xsl:for-each>

  </xsl:template>
</xsl:stylesheet>

在整个文档中,我成功地使用了xsl:if test=position() != count()getNodes模板的内部for-each中正确添加了逗号(1,2,3),EXCEPT。我尝试了许多不同的变体,从使用position()、count()、last()、!=、<gt;,=,not(position()=count()、count()-1、count(()+1等,以及带有xsl:whenxsl:otherwise语句的xsl:choose。我一直看到下面同样的四种模式(还有XSL语法错误和空对象)。

这是我试过的。全部放置在getNodes模板中内for-each<xsl:text>"</xsl:text></xsl:for-each>之后。首先是XSL输入,我对发生的事情的总结,&相关的JSON输出。

测试1:

<xsl:if test="position() != count($pcCap_list/value)" >
  <xsl:text>, </xsl:text>
</xsl:if>
No XSL error.  No JS error.  But only **last element** is printed.
{
"name": "Help Desk Service",
"id": "Class181",
"level": "3",
"data": {
  "pcCap": {
    "id": "Class20022 - pos 3 - count 3"
  }
}
}

测试2:

<xsl:if test="position() = count($pcCap_list/value)" >
  <xsl:text>, </xsl:text>
</xsl:if>
No XSL error.  JS errors = "Uncaught SyntaxError: Unexpected string report:8" && "Uncaught ReferenceError: tree is not defined report:125".  All three are printed as expected with the comma after the third element.
{
  "name": "Help Desk Service",
  "id": "Class181",
  "level": "3",
  "data": {
    "pcCap": {
      "id": "Class180 - pos 1 - count 3""id": "Class182 - pos 2 - count 3""id": "Class20022 - pos 3 - count 3",
    }
  }
}

测试3:

<xsl:if test="position() &lt; count($pcCap_list/value)" >
  <xsl:text>, </xsl:text>
</xsl:if>
No XSL error.  No JS error.  Again, only last item is shown.
{
"name": "Help Desk Service",
"id": "Class181",
"level": "3",
"data": {
  "pcCap": {
    "id": "Class20022 - pos 3 - count 3"
  }
}
}

测试4:

<xsl:if test="position() &lt; count($pcCap_list/value)" > <!-- happens with both &lt; and != -->
  <xsl:text>| </xsl:text>
</xsl:if>
No XSL error.  JS errors = "Uncaught SyntaxError: Unexpected token : report:8" && "Uncaught ReferenceError: tree is not defined report:125".  Prints out as expected, with pipes between the elements.
{
  "name": "Help Desk Service",
  "id": "Class181",
  "level": "3",
  "data": {
    "pcCap": {
      "id": "Class180 - pos 1 - count 3"|"id": "Class182 - pos 2 - count 3"|"id": "Class20022 - pos 3 - count 3"
    }
  }
}

那么,是什么原因导致管道工作而逗号不工作呢?为什么第三个元素有时会自己打印?

您最初发布的转换适用于我的XSL转换器。我想你的问题可能是变压器本身。我只是复制并粘贴了您的XML和XSL,并从XSLT获得了所需的输出。

相关内容

  • 没有找到相关文章

最新更新