在 XPath 中通过 concat() 换行符 (\n)?
Line breaks (\n) via concat() in XPath?
所以我的系统中有一个 XML 员工文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<couriersystem title="System"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="schema.xsd">
<!-- snip -->
<employees>
<employee eid="1">
<nin>AZ123518D</nin>
<firstname>Peter</firstname>
<lastname>Smith</lastname>
<gender>Male</gender>
<dob>1994-02-11</dob>
<email>ps11@gmail.com</email>
<address>
119, London Street, Nidrie, F57 8NE
</address>
<tel>07005748900</tel>
<salary>30526</salary>
<empbranch bid="1" />
<supervisor sid="1" />
</employee>
<employee eid="2">
<nin>CN174869F</nin>
<firstname>Jennifer</firstname>
<lastname>Black</lastname>
<gender>Male</gender>
<dob>1984-12-24</dob>
<email>jb21@gmail.com</email>
<address>
161, South Road, Nidrie, W79 8WG
</address>
<tel>07555111222</tel>
<salary>40576</salary>
<empbranch bid="2" />
<supervisor sid="1" />
</employee>
<employee eid="3">
<nin>ET127654M</nin>
<firstname>Aaron</firstname>
<lastname>Jones</lastname>
<gender>Male</gender>
<dob>1968-03-15</dob>
<email>aj31@gmail.com</email>
<address>
66, High Road, Yoker, Q47 4SR
</address>
<tel>07856471267</tel>
<salary>30526</salary>
<empbranch bid="3" />
<supervisor sid="1" />
</employee>
<employee eid="4">
<nin>GC765238A</nin>
<firstname>Alistair</firstname>
<lastname>Smith</lastname>
<gender>Male</gender>
<dob>1976-11-26</dob>
<email>as11@gmail.com</email>
<address>
109, West Plaza, Clydebank, G55 8RC
</address>
<tel>07000123123</tel>
<salary>25400</salary>
<empbranch bid="4" />
<supervisor sid="1" />
</employee>
<employee eid="5">
<nin>HP146854D</nin>
<firstname>Emma</firstname>
<lastname>Reynolds</lastname>
<gender>Male</gender>
<dob>1995-05-05</dob>
<email>er11@yahoo.com</email>
<address>
57, Scott Street, Aberdeen, O75 2KS
</address>
<tel>07625361536</tel>
<salary>25400</salary>
<empbranch bid="5" />
<supervisor sid="7" />
</employee>
<!-- snip -->
</employees>
<!-- snip -->
</couriersystem>
我有以下 XPath 来检索他们主管的所有员工详细信息:
//employee[supervisor/@sid='1']/concat('Name: ', concat(firstname/text(), ' ', lastname/text(), '\nGender: ', gender/text(), '\nD.O.B: ', dob/text()))
但它只显示了其余员工中的一名员工,\n
字符也显示了。
我该如何解决这个问题?
要让 \n
在 XPath 中被解释为 concat()
,请使用 codepoints-to-string(10)
[credit: @madcrazydrumma]:
//employee[supervisor/@sid='1']/concat('Name: ', firstname, ' ', lastname,
codepoints-to-string(10),
'Gender: ', gender,
codepoints-to-string(10),
'D.O.B: ', dob)
然后 return 结果如下:
Name: Peter Smith
Gender: Male
D.O.B: 1994-02-11
Name: Jennifer Black
Gender: Male
D.O.B: 1984-12-24
Name: Aaron Jones
Gender: Male
D.O.B: 1968-03-15
Name: Alistair Smith
Gender: Male
D.O.B: 1976-11-26
小提示:您的基本 XPath 2.0 表达式结果证明是好的。正如我们在评论中发现的那样,由于站点的限制,结果不正确,xpathtester.com/xpath. Use videlibri.sourceforge.net/cgi-bin/xidelcgi 而不是在线 XPath 2.0 测试。
好吧,我用 XSLT 测试了你的 XPath 表达式,输出包含你想要的 4 个条目:
我的 XSLT 是:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/couriersystem">
<xsl:copy-of select="//employee[supervisor/@sid='1']/concat('Name: ', concat(firstname/text(), ' ', lastname/text(), '\nGender: ', gender/text(), '\nD.O.B: ', dob/text()))" />
</xsl:template>
</xsl:stylesheet>
结果全部在一行文本中:
<?xml version="1.0" encoding="UTF-8"?>Name: Peter Smith\nGender: Male\nD.O.B: 1994-02-11 Name: Jennifer Black\nGender: Male\nD.O.B: 1984-12-24 Name: Aaron Jones\nGender: Male\nD.O.B: 1968-03-15 Name: Alistair Smith\nGender: Male\nD.O.B: 1976-11-26
如果您希望输出的格式比上面的多一点,请尝试在适当的位置插入 space
个字符的表达式:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/couriersystem">
<xsl:value-of select="' '" />
<xsl:for-each select="//employee[supervisor/@sid='1']">
<xsl:value-of select="concat('Name: ', firstname/text(), ' ', lastname/text(), ' ','Gender: ', gender/text(), ' ','D.O.B: ', dob/text(),' ')" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
结果是:
<?xml version="1.0" encoding="UTF-8"?>
Name: Peter Smith
Gender: Male
D.O.B: 1994-02-11
Name: Jennifer Black
Gender: Male
D.O.B: 1984-12-24
Name: Aaron Jones
Gender: Male
D.O.B: 1968-03-15
Name: Alistair Smith
Gender: Male
D.O.B: 1976-11-26
P.S.: 'Jennifer Black'是变性人吗?因为她的名字是女名,性别是男 ;-)
所以我的系统中有一个 XML 员工文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<couriersystem title="System"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="schema.xsd">
<!-- snip -->
<employees>
<employee eid="1">
<nin>AZ123518D</nin>
<firstname>Peter</firstname>
<lastname>Smith</lastname>
<gender>Male</gender>
<dob>1994-02-11</dob>
<email>ps11@gmail.com</email>
<address>
119, London Street, Nidrie, F57 8NE
</address>
<tel>07005748900</tel>
<salary>30526</salary>
<empbranch bid="1" />
<supervisor sid="1" />
</employee>
<employee eid="2">
<nin>CN174869F</nin>
<firstname>Jennifer</firstname>
<lastname>Black</lastname>
<gender>Male</gender>
<dob>1984-12-24</dob>
<email>jb21@gmail.com</email>
<address>
161, South Road, Nidrie, W79 8WG
</address>
<tel>07555111222</tel>
<salary>40576</salary>
<empbranch bid="2" />
<supervisor sid="1" />
</employee>
<employee eid="3">
<nin>ET127654M</nin>
<firstname>Aaron</firstname>
<lastname>Jones</lastname>
<gender>Male</gender>
<dob>1968-03-15</dob>
<email>aj31@gmail.com</email>
<address>
66, High Road, Yoker, Q47 4SR
</address>
<tel>07856471267</tel>
<salary>30526</salary>
<empbranch bid="3" />
<supervisor sid="1" />
</employee>
<employee eid="4">
<nin>GC765238A</nin>
<firstname>Alistair</firstname>
<lastname>Smith</lastname>
<gender>Male</gender>
<dob>1976-11-26</dob>
<email>as11@gmail.com</email>
<address>
109, West Plaza, Clydebank, G55 8RC
</address>
<tel>07000123123</tel>
<salary>25400</salary>
<empbranch bid="4" />
<supervisor sid="1" />
</employee>
<employee eid="5">
<nin>HP146854D</nin>
<firstname>Emma</firstname>
<lastname>Reynolds</lastname>
<gender>Male</gender>
<dob>1995-05-05</dob>
<email>er11@yahoo.com</email>
<address>
57, Scott Street, Aberdeen, O75 2KS
</address>
<tel>07625361536</tel>
<salary>25400</salary>
<empbranch bid="5" />
<supervisor sid="7" />
</employee>
<!-- snip -->
</employees>
<!-- snip -->
</couriersystem>
我有以下 XPath 来检索他们主管的所有员工详细信息:
//employee[supervisor/@sid='1']/concat('Name: ', concat(firstname/text(), ' ', lastname/text(), '\nGender: ', gender/text(), '\nD.O.B: ', dob/text()))
但它只显示了其余员工中的一名员工,\n
字符也显示了。
我该如何解决这个问题?
要让 \n
在 XPath 中被解释为 concat()
,请使用 codepoints-to-string(10)
[credit: @madcrazydrumma]:
//employee[supervisor/@sid='1']/concat('Name: ', firstname, ' ', lastname,
codepoints-to-string(10),
'Gender: ', gender,
codepoints-to-string(10),
'D.O.B: ', dob)
然后 return 结果如下:
Name: Peter Smith
Gender: Male
D.O.B: 1994-02-11
Name: Jennifer Black
Gender: Male
D.O.B: 1984-12-24
Name: Aaron Jones
Gender: Male
D.O.B: 1968-03-15
Name: Alistair Smith
Gender: Male
D.O.B: 1976-11-26
小提示:您的基本 XPath 2.0 表达式结果证明是好的。正如我们在评论中发现的那样,由于站点的限制,结果不正确,xpathtester.com/xpath. Use videlibri.sourceforge.net/cgi-bin/xidelcgi 而不是在线 XPath 2.0 测试。
好吧,我用 XSLT 测试了你的 XPath 表达式,输出包含你想要的 4 个条目:
我的 XSLT 是:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/couriersystem">
<xsl:copy-of select="//employee[supervisor/@sid='1']/concat('Name: ', concat(firstname/text(), ' ', lastname/text(), '\nGender: ', gender/text(), '\nD.O.B: ', dob/text()))" />
</xsl:template>
</xsl:stylesheet>
结果全部在一行文本中:
<?xml version="1.0" encoding="UTF-8"?>Name: Peter Smith\nGender: Male\nD.O.B: 1994-02-11 Name: Jennifer Black\nGender: Male\nD.O.B: 1984-12-24 Name: Aaron Jones\nGender: Male\nD.O.B: 1968-03-15 Name: Alistair Smith\nGender: Male\nD.O.B: 1976-11-26
如果您希望输出的格式比上面的多一点,请尝试在适当的位置插入 space
个字符的表达式:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/couriersystem">
<xsl:value-of select="' '" />
<xsl:for-each select="//employee[supervisor/@sid='1']">
<xsl:value-of select="concat('Name: ', firstname/text(), ' ', lastname/text(), ' ','Gender: ', gender/text(), ' ','D.O.B: ', dob/text(),' ')" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
结果是:
<?xml version="1.0" encoding="UTF-8"?>
Name: Peter Smith
Gender: Male
D.O.B: 1994-02-11
Name: Jennifer Black
Gender: Male
D.O.B: 1984-12-24
Name: Aaron Jones
Gender: Male
D.O.B: 1968-03-15
Name: Alistair Smith
Gender: Male
D.O.B: 1976-11-26
P.S.: 'Jennifer Black'是变性人吗?因为她的名字是女名,性别是男 ;-)