2016-11-17 105 views
0

我有下面的xml,我需要,我们需要利用我们已经来达到的XSLT递归

输入XML我已经引用为具有子节点如下最顶层节点XSLT转换为预期输出XML:

 <?xml version="1.0"?> 
<referenced> 
    <name>PocTree/PocTree.services:getReferencesForServices</name> 
    <LOCK_STATUS>3</LOCK_STATUS> 
    <type> 
    <svc_type>flow</svc_type> 
    <svc_subtype>default</svc_subtype> 
    </type> 
    <path/> 
    <isPub>false</isPub> 
    <isNotification>false</isNotification> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
    <status>reference</status> 
    <reference> 
    <name>WmRoot/wm.server.ns.dependency:getReferenced</name> 
    <LOCK_STATUS>2</LOCK_STATUS> 
    <type> 
     <svc_type>java</svc_type> 
     <svc_subtype>unknown</svc_subtype> 
    </type> 
    <path>/Flow Path;1.0/INVOKE;0</path> 
    <isPub>false</isPub> 
    <isNotification>false</isNotification> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
    <status>resolved</status> 
    </reference> 
    <reference> 
    <name>WmPublic/pub.xml:documentToXMLString</name> 
    <LOCK_STATUS>2</LOCK_STATUS> 
    <type> 
     <svc_type>java</svc_type> 
     <svc_subtype>unknown</svc_subtype> 
    </type> 
    <path>/Flow Path;1.0/INVOKE;1</path> 
    <isPub>false</isPub> 
    <isNotification>false</isNotification> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
    <status>resolved</status> 
    </reference> 
    <reference> 
    <name>PocTree/PocTree.services:jkl</name> 
    <LOCK_STATUS>3</LOCK_STATUS> 
    <type> 
     <svc_type>xsltservice</svc_type> 
     <svc_subtype>unknown</svc_subtype> 
    </type> 
    <path>/Flow Path;1.0/INVOKE;2</path> 
    <isPub>false</isPub> 
    <isNotification>false</isNotification> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
    <status>resolved</status> 
    </reference> 
    <reference> 
    <name>WmPublic/pub.xml:xmlStringToXMLNode</name> 
    <LOCK_STATUS>2</LOCK_STATUS> 
    <type> 
     <svc_type>java</svc_type> 
     <svc_subtype>unknown</svc_subtype> 
    </type> 
    <path>/Flow Path;1.0/INVOKE;3</path> 
    <isPub>false</isPub> 
    <isNotification>false</isNotification> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
    <status>resolved</status> 
    </reference> 
    <reference> 
    <name>WmPublic/pub.xml:xmlNodeToDocument</name> 
    <LOCK_STATUS>2</LOCK_STATUS> 
    <type> 
     <svc_type>java</svc_type> 
     <svc_subtype>unknown</svc_subtype> 
    </type> 
    <path>/Flow Path;1.0/INVOKE;4</path> 
    <isPub>false</isPub> 
    <isNotification>false</isNotification> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
    <status>resolved</status> 
    </reference> 
    <reference> 
    <name>PocTree/PocTree.services:ghi</name> 
    <LOCK_STATUS>4</LOCK_STATUS> 
    <type> 
     <svc_type>xsltservice</svc_type> 
     <svc_subtype>unknown</svc_subtype> 
    </type> 
    <path>/Flow Path;1.0/INVOKE;5</path> 
    <isPub>false</isPub> 
    <isNotification>false</isNotification> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
    <status>resolved</status> 
    </reference> 
    <reference> 
    <name>WxPackageTree/WxPackageTree.doc:NodeInfo</name> 
    <LOCK_STATUS>2</LOCK_STATUS> 
    <type> 
     <type_name>record</type_name> 
    </type> 
    <path>/Service Path;1.0/signature;2;subPath;"/nodes;4;0;WxPackageTree.doc:NodeInfo"</path> 
    <isPub>false</isPub> 
    <isNotification>false</isNotification> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
    <status>reference</status> 
    <reference> 
     <name>WxPackageTree/WxPackageTree.doc:NodeInfo</name> 
     <LOCK_STATUS>2</LOCK_STATUS> 
     <type> 
     <type_name>record</type_name> 
     </type> 
     <path>/children;4;1;WxPackageTree.doc:NodeInfo</path> 
     <isPub>false</isPub> 
     <isNotification>false</isNotification> 
     <isFlowServiceDisabled>false</isFlowServiceDisabled> 
     <status>recursive</status> 
    </reference> 
    <reference> 
    <name>PocTree/PocTree.docs:nodeInfo</name> 
    <LOCK_STATUS>4</LOCK_STATUS> 
    <type> 
     <type_name>record</type_name> 
    </type> 
    <path>/Flow Path;1.0/MAP;6/MAPCOPY;1/to_field;-2;subPath;"/nodeInfo;4;0;PocTree.docs:nodeInfo"</path> 
    <path>/Flow Path;1.0/MAP;6/MAPCOPY;2/to_field;-2;subPath;"/nodeInfo;4;0;PocTree.docs:nodeInfo"</path> 
    <path>/Flow Path;1.0/MAP;6/MAPCOPY;3/to_field;-2;subPath;"/nodeInfo;4;0;PocTree.docs:nodeInfo"</path> 
    <isPub>false</isPub> 
    <isNotification>false</isNotification> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
    <status>reference</status> 
    <reference> 
     <name>PocTree/PocTree.docs:nodeInfo</name> 
     <LOCK_STATUS>4</LOCK_STATUS> 
     <type> 
     <type_name>record</type_name> 
     </type> 
     <path>/children;4;1;PocTree.docs:nodeInfo</path> 
     <isPub>false</isPub> 
     <isNotification>false</isNotification> 
     <isFlowServiceDisabled>false</isFlowServiceDisabled> 
     <status>recursive</status> 
    </reference> 
    </reference> 
    </reference> 
</referenced> 

XSLT写:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="x"/> 

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

<xsl:template match="referenced | reference"> 
    <nodeInfo> 
     <name> 
     <xsl:value-of select="substring-after(name, '/')"/> 
     </name> 
     <rowId> 
      <xsl:value-of select="generate-id()"/> 
     </rowId> 
     <parentId> 
      <xsl:value-of select="generate-id(..)"/> 
     </parentId> 
<xsl:apply-templates select="isFlowServiceDisabled"/> 
      <xsl:apply-templates select="type"/> 
      <xsl:copy-of select="isPub"/> 
      <xsl:copy-of select="isFlowServiceDisabled"/> 
    </nodeInfo> 
    <xsl:apply-templates select="reference"/> 
</xsl:template> 


<xsl:template match="type[svc_type]"> 
     <type> 
      <xsl:value-of select="svc_type" /> 
     </type> 
    </xsl:template> 

    <xsl:template match="type[type_name]"> 
     <type> 
      <xsl:value-of select="type_name" /> 
     </type> 
    </xsl:template> 

<xsl:template match="type[trigger_type]"> 
     <type> 
      <xsl:value-of select="trigger_type" /> 
     </type> 
    </xsl:template> 

    <xsl:template match="isFlowServiceDisabled" > 

     <xsl:choose> 
      <xsl:when test="isFlowServiceDisabled[contains(., 'false')]"> 
       <isFlowServiceDisabled> 
        <xsl:value-of select="isFlowServiceDisabled" /> 
       </isFlowServiceDisabled> 
      </xsl:when> 
      <xsl:otherwise/> 

     </xsl:choose> 

    </xsl:template> 

    <xsl:template match="reference[type/svc_type[not(contains(., 'flow') or contains(., 'java') or contains(., 'xsltservice'))]]" /> 


    <xsl:template match="reference[type/type_name[not(contains(., 'ConnectionData') or contains(., 'webServiceDescriptor'))]]" priority="2" /> 

    <xsl:template match="reference[type/trigger_type[not(contains(., 'jms-trigger') or contains(., 'broker-trigger'))]]" priority="2" /> 




</xsl:stylesheet> 

目标XML即时寻找

<nodeInfo> 
    - 
    - 
    <rowId>1</rowId> 
    <parentNodeId>0</parentNodeId> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
</nodeInfo> 
<nodeInfo> 
    - 
    - 
    <rowId>2</rowId> 
    <parentNodeId>1</parentNodeId> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
</nodeInfo> 
<nodeInfo> 
    - 
    - 
    <rowId>3</rowId> 
    <parentNodeId>1</parentNodeId> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
</nodeInfo> 
<nodeInfo> 
    - 
    - 
    <rowId>4</rowId> 
    <parentNodeId>1</parentNodeId> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
</nodeInfo> 
<nodeInfo> 
    - 
    - 
    <rowId>5</rowId> 
    <parentNodeId>4</parentNodeId> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
</nodeInfo> 
<nodeInfo> 
    - 
    - 
    <rowId>6</rowId> 
    <parentNodeId>4</parentNodeId> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
</nodeInfo> 
<nodeInfo> 
    - 
    - 
    <rowId>7</rowId> 
    <parentNodeId>1</parentNodeId> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
</nodeInfo> 
<nodeInfo> 
    - 
    - 
    <rowId>8</rowId> 
    <parentNodeId>7</parentNodeId> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
</nodeInfo> 
<nodeInfo> 
    - 
    - 
    <rowId>9</rowId> 
    <parentNodeId>7</parentNodeId> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
</nodeInfo> 
<nodeInfo> 
    - 
    - 
    <rowId>10</rowId> 
    <parentNodeId>9</parentNodeId> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
</nodeInfo> 

问题我现在面临的是如预期的标签<isFlowServiceDisabled>所写的条件无法正常工作。含义我得到的标签为空值,不知道我的XSLT有什么问题。除了XSLT中的其他条件外,我还希望强制执行一个规则,如果节点<isFlowServiceDisabled>的值为“false”,那么只包含或不包含。

请告诉我什么是空值。

回答

0

我觉得下面应该是固定的,

你不需要下面的模板。你也不应该使用xsl:在这里选择只会做。此外,您还添加了xsl:copy-of select =“isFlowServiceDisabled”,它将覆盖您的模板调用。我已经删除它。

<xsl:template match="isFlowServiceDisabled" > 

    <xsl:choose> 
     <xsl:when test="isFlowServiceDisabled[contains(., 'false')]"> 
      <isFlowServiceDisabled> 
       <xsl:value-of select="isFlowServiceDisabled" /> 
      </isFlowServiceDisabled> 
     </xsl:when> 
     <xsl:otherwise/> 

    </xsl:choose> 

</xsl:template> 

应该不用模板来完成,

<xsl:if test="isFlowServiceDisabled = 'false'"> 
    <isFlowServiceDisabled> 
      false 
    </isFlowServiceDisabled> 
</xsl:if> 

编辑:更新XML和XSL适当所需的输出。 检查演示在这里:http://xsltransform.net/ejivdHb/8

<?xml version="1.0"?> 
    <referenced> 
     <name>PocTree/PocTree.services:getReferencesForServices</name> 
     <LOCK_STATUS>3</LOCK_STATUS> 
     <type> 
     <svc_type>flow</svc_type> 
     <svc_subtype>default</svc_subtype> 
     </type> 
<path /> 
<isPub>false</isPub> 
<isNotification>false</isNotification> 
<isFlowServiceDisabled>true</isFlowServiceDisabled> 
<status>reference</status> 
<reference> 
    <name>WmRoot/wm.server.ns.dependency:getReferenced</name> 
    <LOCK_STATUS>2</LOCK_STATUS> 
    <type> 
     <svc_type>java</svc_type> 
     <svc_subtype>unknown</svc_subtype> 
    </type> 
    <path>/Flow Path;1.0/INVOKE;0</path> 
    <isPub>false</isPub> 
    <isNotification>false</isNotification> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
    <status>resolved</status> 
</reference> 
<reference> 
    <name>WmPublic/pub.xml:documentToXMLString</name> 
    <LOCK_STATUS>2</LOCK_STATUS> 
    <type> 
     <svc_type>java</svc_type> 
     <svc_subtype>unknown</svc_subtype> 
    </type> 
    <path>/Flow Path;1.0/INVOKE;1</path> 
    <isPub>false</isPub> 
    <isNotification>false</isNotification> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
    <status>resolved</status> 
</reference> 
<reference> 
    <name>PocTree/PocTree.services:jkl</name> 
    <LOCK_STATUS>3</LOCK_STATUS> 
    <type> 
     <svc_type>xsltservice</svc_type> 
     <svc_subtype>unknown</svc_subtype> 
    </type> 
    <path>/Flow Path;1.0/INVOKE;2</path> 
    <isPub>false</isPub> 
    <isNotification>false</isNotification> 
    <isFlowServiceDisabled>true</isFlowServiceDisabled> 
    <status>resolved</status> 
</reference> 
<reference> 
    <name>WmPublic/pub.xml:xmlStringToXMLNode</name> 
    <LOCK_STATUS>2</LOCK_STATUS> 
    <type> 
     <svc_type>java</svc_type> 
     <svc_subtype>unknown</svc_subtype> 
    </type> 
    <path>/Flow Path;1.0/INVOKE;3</path> 
    <isPub>false</isPub> 
    <isNotification>false</isNotification> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
    <status>resolved</status> 
</reference> 
<reference> 
    <name>WmPublic/pub.xml:xmlNodeToDocument</name> 
    <LOCK_STATUS>2</LOCK_STATUS> 
    <type> 
     <svc_type>java</svc_type> 
     <svc_subtype>unknown</svc_subtype> 
    </type> 
    <path>/Flow Path;1.0/INVOKE;4</path> 
    <isPub>false</isPub> 
    <isNotification>false</isNotification> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
    <status>resolved</status> 
</reference> 
<reference> 
    <name>PocTree/PocTree.services:ghi</name> 
    <LOCK_STATUS>4</LOCK_STATUS> 
    <type> 
     <svc_type>xsltservice</svc_type> 
     <svc_subtype>unknown</svc_subtype> 
    </type> 
    <path>/Flow Path;1.0/INVOKE;5</path> 
    <isPub>false</isPub> 
    <isNotification>false</isNotification> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
    <status>resolved</status> 
</reference> 
<reference> 
    <name>WxPackageTree/WxPackageTree.doc:NodeInfo</name> 
    <LOCK_STATUS>2</LOCK_STATUS> 
    <type> 
     <type_name>record</type_name> 
    </type> 
    <path>/Service Path;1.0/signature;2;subPath;"/nodes;4;0;WxPackageTree.doc:NodeInfo"</path> 
    <isPub>false</isPub> 
    <isNotification>false</isNotification> 
    <isFlowServiceDisabled>false</isFlowServiceDisabled> 
    <status>reference</status> 
    <reference> 
     <name>WxPackageTree/WxPackageTree.doc:NodeInfo</name> 
     <LOCK_STATUS>2</LOCK_STATUS> 
     <type> 
      <type_name>record</type_name> 
     </type> 
     <path>/children;4;1;WxPackageTree.doc:NodeInfo</path> 
     <isPub>false</isPub> 
     <isNotification>false</isNotification> 
     <isFlowServiceDisabled>false</isFlowServiceDisabled> 
     <status>recursive</status> 
    </reference> 
    <reference> 
     <name>PocTree/PocTree.docs:nodeInfo</name> 
     <LOCK_STATUS>4</LOCK_STATUS> 
     <type> 
      <type_name>record</type_name> 
     </type> 
     <path>/Flow Path;1.0/MAP;6/MAPCOPY;1/to_field;-2;subPath;"/nodeInfo;4;0;PocTree.docs:nodeInfo"</path> 
     <path>/Flow Path;1.0/MAP;6/MAPCOPY;2/to_field;-2;subPath;"/nodeInfo;4;0;PocTree.docs:nodeInfo"</path> 
     <path>/Flow Path;1.0/MAP;6/MAPCOPY;3/to_field;-2;subPath;"/nodeInfo;4;0;PocTree.docs:nodeInfo"</path> 
     <isPub>false</isPub> 
     <isNotification>false</isNotification> 
     <isFlowServiceDisabled>false</isFlowServiceDisabled> 
     <status>reference</status> 
     <reference> 
      <name>PocTree/PocTree.docs:nodeInfo</name> 
      <LOCK_STATUS>4</LOCK_STATUS> 
      <type> 
       <type_name>record</type_name> 
      </type> 
      <path>/children;4;1;PocTree.docs:nodeInfo</path> 
      <isPub>false</isPub> 
      <isNotification>false</isNotification> 
      <isFlowServiceDisabled>false</isFlowServiceDisabled> 
      <status>recursive</status> 
     </reference> 
    </reference> 
</reference> 

XSL

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:strip-space elements="x"/> 

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

    <xsl:template match="referenced | reference"> 
    <nodeInfo> 
    <name> 
     <xsl:value-of select="substring-after(name, '/')"/> 
    </name> 
    <rowId> 
     <xsl:value-of select="generate-id()"/> 
    </rowId> 
    <parentId> 
     <xsl:value-of select="generate-id(..)"/> 
    </parentId> 

     <xsl:apply-templates select="type"/> 
     <xsl:copy-of select="isPub"/> 

    <xsl:if test="isFlowServiceDisabled = 'false'"> 
     <isFlowServiceDisabled>false</isFlowServiceDisabled> 
    </xsl:if> 
</nodeInfo> 
<xsl:apply-templates select="reference"/> 
</xsl:template> 


    <xsl:template match="type[svc_type]"> 
    <type> 
     <xsl:value-of select="svc_type" /> 
    </type> 
    </xsl:template> 

    <xsl:template match="type[type_name]"> 
    <type> 
     <xsl:value-of select="type_name" /> 
    </type> 
    </xsl:template> 

    <xsl:template match="type[trigger_type]"> 
    <type> 
     <xsl:value-of select="trigger_type" /> 
    </type> 
    </xsl:template> 



    <xsl:template match="reference[type/svc_type[not(contains(., 'flow') or contains(., 'java') or contains(., 'xsltservice'))]]" /> 


    <xsl:template match="reference[type/type_name[not(contains(., 'ConnectionData') or contains(., 'webServiceDescriptor'))]]" priority="2" /> 

    <xsl:template match="reference[type/trigger_type[not(contains(., 'jms-trigger') or contains(., 'broker-trigger'))]]" priority="2" /> 

    </xsl:stylesheet> 
+0

谢谢您的输入。那么再次我有一个问题:当是已经在那里,因为我想整个我值“真”,那么在我的XML输出它与空值来跳过如果是真实的。如何为此调整xslt? – Nis

+0

@Nis请接受我对你原来问题的回答。然而,对于新的要求,你可以检查isServiceDisabled类似isFlowServiceDisabled,把参考块进去 – ScanQR

+0

@Nis没有这个解决您的查询? – ScanQR