如果节点有时是不同的元素,我如何对节点进行编号
How do I number the nodes, if they are sometimes different elements
我需要使用 xsl 转换对包含数据 (xml) 的节点进行编号。编号的节点可能包含具有不同标签名称的元素。
我一直在寻找解决方案,但找不到正确的编号方式。
这是一个示例输入文件:
<Contract>
<Parametr1>
<Interposes>
<Accomplice>
<Person>
<Name>John</Name>
<Surname>Person1</Surname>
</Person>
</Accomplice>
<Representative>
<Name>George</Name>
<Surname>Person2</Surname>
</Representative>
</Interposes>
<Interposes>
<Accomplice>
<Person>
<Name>Andy</Name>
<Surname>Person3</Surname>
</Person>
</Accomplice>
</Interposes>
<Interposes>
<Accomplice>
<Firm>
<FirmName>VeloDrom</FirmName>
<Description>Description</Description>
</Firm>
</Accomplice>
<Representative>
<Name>Agnes</Name>
<Surname>Person4</Surname>
</Representative>
<Representative>
<Name>Michael</Name>
<Surname>Person5</Surname>
</Representative>
</Interposes>
</Parametr1>
</Contract>
正确的结果应该是这样的:
- George Person2 representing a person: John Person1
- Andy Person3
- Agnes Person4 representing a firm: VeloDrom Description
- Michael Person5 representing a firm: VeloDrom Description
我尝试解决(未成功):
<xsl:template match="Contract">
<xsl:apply-templates select="Parametr1"/>
</xsl:template>
<xsl:template match="Parametr1">
<xsl:apply-templates select="Interposes/Accomplice/Person"/>
<xsl:apply-templates select="Interposes/Representative"/>
</xsl:template>
<xsl:template match="Interposes/Accomplice/Person | Interposes/Representative">
<xsl:number format="1. " count="Interposes/Accomplice/Person | Interposes/Representative"/>
<xsl:choose>
<xsl:when test="count(./Interposes/Representative)=0">
<xsl:apply-templates select="Interposes/Accomplice/Person"/>
</xsl:when>
<xsl:when test="count(./Interposes/Representative) > 0">
<xsl:text> </xsl:text>
<xsl:value-of select="./Name"/><xsl:text> </xsl:text>
<xsl:value-of select="./Surname"/>
<xsl:if test="count(../Representative) > 0">
<xsl:if test="../Accomplice/Person">
<xsl:text>, representing a person: </xsl:text>
<xsl:value-of select="../Accomplice/Person/Name"/><xsl:text> </xsl:text>
<xsl:value-of select="../Accomplice/Person/Surname"/>
</xsl:if>
<xsl:if test="../Accomplice/Firm">
<xsl:text>, representing a firm: </xsl:text>
<xsl:value-of select="../Accomplice/Firm/FirmName"/><xsl:text> </xsl:text>
<xsl:value-of select="../Accomplice/Firm/Description"/>
</xsl:if>
</xsl:if>
</xsl:when>
</xsl:choose>
</xsl:template>
如何正确操作?
首先,在匹配 Parametr1
的模板中,您应该将两个 xsl:apply-templates
合二为一。
<xsl:apply-templates select="Interposes[not(Representative)]/Accomplice
|Interposes/Representative"/>
虽然在这种情况下,我对 select 和 Accomplice
元素做了轻微的修改,并且只修改了那些没有 Representative
的元素
这样做,然后允许您使用 position()
函数来获取数字。这将 return 您刚刚 select 编辑的各种节点的位置(按文档顺序)。
为了保持整洁,我会为 Accomplice
和 Representative
使用单独的模板....
<xsl:template match="Accomplice">
<xsl:value-of select="position()"/>
<xsl:text>. </xsl:text>
<!-- Select either Person or Firm -->
<xsl:template match="Representative">
<xsl:value-of select="position()"/>
<xsl:text>. </xsl:text>
<xsl:value-of select="concat(Name, ' ', Surname)"/>
请注意,您不需要此处匹配中元素名称的完整路径。另请注意,在这种情况下,您不需要 Accomplice
上的条件,因为它将 selecting 那些条件为真的元素。
它现在应该变得更直接一些,唯一的额外工作是在 Representative
模板中,选择他们是代表公司还是个人
<xsl:choose>
<xsl:when test="../Accomplice/Person">
<xsl:text>, representing a person: </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>, representing a firm: </xsl:text>
</xsl:otherwise>
</xsl:choose>
试试这个 XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="Parametr1">
<xsl:apply-templates select="Interposes[not(Representative)]/Accomplice|Interposes/Representative"/>
</xsl:template>
<xsl:template match="Accomplice">
<xsl:value-of select="position()"/>
<xsl:text>. </xsl:text>
<!-- Select either Person or Firm -->
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="Representative">
<xsl:value-of select="position()"/>
<xsl:text>. </xsl:text>
<xsl:value-of select="concat(Name, ' ', Surname)"/>
<xsl:choose>
<xsl:when test="../Accomplice/Person">
<xsl:text>, representing a person: </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>, representing a firm: </xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates select="../Accomplice/*"/>
</xsl:template>
<xsl:template match="Person">
<xsl:value-of select="concat(Name, ' ', Surname)"/>
<xsl:value-of select="' '"/>
</xsl:template>
<xsl:template match="Firm">
<xsl:value-of select="concat(FirmName, ' ', Description)"/>
<xsl:value-of select="' '"/>
</xsl:template>
</xsl:stylesheet>
注意匹配 Person
和 Firm
的模板的使用,以允许它们在 Accomplice
和 Representative
模板中使用。
我需要使用 xsl 转换对包含数据 (xml) 的节点进行编号。编号的节点可能包含具有不同标签名称的元素。 我一直在寻找解决方案,但找不到正确的编号方式。
这是一个示例输入文件:
<Contract>
<Parametr1>
<Interposes>
<Accomplice>
<Person>
<Name>John</Name>
<Surname>Person1</Surname>
</Person>
</Accomplice>
<Representative>
<Name>George</Name>
<Surname>Person2</Surname>
</Representative>
</Interposes>
<Interposes>
<Accomplice>
<Person>
<Name>Andy</Name>
<Surname>Person3</Surname>
</Person>
</Accomplice>
</Interposes>
<Interposes>
<Accomplice>
<Firm>
<FirmName>VeloDrom</FirmName>
<Description>Description</Description>
</Firm>
</Accomplice>
<Representative>
<Name>Agnes</Name>
<Surname>Person4</Surname>
</Representative>
<Representative>
<Name>Michael</Name>
<Surname>Person5</Surname>
</Representative>
</Interposes>
</Parametr1>
</Contract>
正确的结果应该是这样的:
- George Person2 representing a person: John Person1
- Andy Person3
- Agnes Person4 representing a firm: VeloDrom Description
- Michael Person5 representing a firm: VeloDrom Description
我尝试解决(未成功):
<xsl:template match="Contract">
<xsl:apply-templates select="Parametr1"/>
</xsl:template>
<xsl:template match="Parametr1">
<xsl:apply-templates select="Interposes/Accomplice/Person"/>
<xsl:apply-templates select="Interposes/Representative"/>
</xsl:template>
<xsl:template match="Interposes/Accomplice/Person | Interposes/Representative">
<xsl:number format="1. " count="Interposes/Accomplice/Person | Interposes/Representative"/>
<xsl:choose>
<xsl:when test="count(./Interposes/Representative)=0">
<xsl:apply-templates select="Interposes/Accomplice/Person"/>
</xsl:when>
<xsl:when test="count(./Interposes/Representative) > 0">
<xsl:text> </xsl:text>
<xsl:value-of select="./Name"/><xsl:text> </xsl:text>
<xsl:value-of select="./Surname"/>
<xsl:if test="count(../Representative) > 0">
<xsl:if test="../Accomplice/Person">
<xsl:text>, representing a person: </xsl:text>
<xsl:value-of select="../Accomplice/Person/Name"/><xsl:text> </xsl:text>
<xsl:value-of select="../Accomplice/Person/Surname"/>
</xsl:if>
<xsl:if test="../Accomplice/Firm">
<xsl:text>, representing a firm: </xsl:text>
<xsl:value-of select="../Accomplice/Firm/FirmName"/><xsl:text> </xsl:text>
<xsl:value-of select="../Accomplice/Firm/Description"/>
</xsl:if>
</xsl:if>
</xsl:when>
</xsl:choose>
</xsl:template>
如何正确操作?
首先,在匹配 Parametr1
的模板中,您应该将两个 xsl:apply-templates
合二为一。
<xsl:apply-templates select="Interposes[not(Representative)]/Accomplice
|Interposes/Representative"/>
虽然在这种情况下,我对 select 和 Accomplice
元素做了轻微的修改,并且只修改了那些没有 Representative
这样做,然后允许您使用 position()
函数来获取数字。这将 return 您刚刚 select 编辑的各种节点的位置(按文档顺序)。
为了保持整洁,我会为 Accomplice
和 Representative
使用单独的模板....
<xsl:template match="Accomplice">
<xsl:value-of select="position()"/>
<xsl:text>. </xsl:text>
<!-- Select either Person or Firm -->
<xsl:template match="Representative">
<xsl:value-of select="position()"/>
<xsl:text>. </xsl:text>
<xsl:value-of select="concat(Name, ' ', Surname)"/>
请注意,您不需要此处匹配中元素名称的完整路径。另请注意,在这种情况下,您不需要 Accomplice
上的条件,因为它将 selecting 那些条件为真的元素。
它现在应该变得更直接一些,唯一的额外工作是在 Representative
模板中,选择他们是代表公司还是个人
<xsl:choose>
<xsl:when test="../Accomplice/Person">
<xsl:text>, representing a person: </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>, representing a firm: </xsl:text>
</xsl:otherwise>
</xsl:choose>
试试这个 XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="Parametr1">
<xsl:apply-templates select="Interposes[not(Representative)]/Accomplice|Interposes/Representative"/>
</xsl:template>
<xsl:template match="Accomplice">
<xsl:value-of select="position()"/>
<xsl:text>. </xsl:text>
<!-- Select either Person or Firm -->
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="Representative">
<xsl:value-of select="position()"/>
<xsl:text>. </xsl:text>
<xsl:value-of select="concat(Name, ' ', Surname)"/>
<xsl:choose>
<xsl:when test="../Accomplice/Person">
<xsl:text>, representing a person: </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>, representing a firm: </xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates select="../Accomplice/*"/>
</xsl:template>
<xsl:template match="Person">
<xsl:value-of select="concat(Name, ' ', Surname)"/>
<xsl:value-of select="' '"/>
</xsl:template>
<xsl:template match="Firm">
<xsl:value-of select="concat(FirmName, ' ', Description)"/>
<xsl:value-of select="' '"/>
</xsl:template>
</xsl:stylesheet>
注意匹配 Person
和 Firm
的模板的使用,以允许它们在 Accomplice
和 Representative
模板中使用。