2014-03-13 5 views
0

XML 파일에서 첫 번째 비어 있지 않은 값을 가져 오는 데 문제가 있습니다. 여기 XML에서 첫 번째 비어 있지 않은 값 찾기

가있는 것처럼 XML 파일이 보이는 것을 : 내가 처음 <last_printed> 요소는이 XSLT를 사용하여 날짜를 구문 분석 잡기 위해 노력하고

<?xml version="1.0"?> 
<ROOT> 
<Student> 
    <Student_id>TEST1</Student_id> 
    <last_printed>2014-03-11-08:00</last_printed> 
</Student> 
<Student> 
    <Student_id>TEST3</Student_id> 
    <last_printed></last_printed> 
</Student> 
<Student> 
    <Student_id>TEST4</Student_id> 
    <last_printed>2014-03-06-08:00</last_printed> 
</Student> 
</ROOT> 

:

<xsl:variable name="day" select="substring-before(substring-after(substring-after(/ROOT/Student[1]/last_printed[text() != ''], '-'), '-'), '-')"/> 
<xsl:variable name="month" select="substring-before(substring-after(/ROOT/Student[1]/last_printed[text() != ''], '-'), '-')"/> 
<xsl:variable name="year" select="substring-before(/ROOT/Student[1]/last_printed[text() != ''], '-')"/> 

최종 결과는 인 표시되는 날짜 MMDDYYYY :

<xsl:value-of select="substring(concat($month, $day, $year, $padding), 1, 8)"/> 

색인을 배치 해 보았습니다.

시퀀스 : 나는 오류가 나타 얻을

<xsl:variable name="year" select="substring-before(/ROOT/Student/last_printed[1][text() != ''], '-')"/> 

나는 [1]을 포함하지 않는 경우 : 위와 같이 변수 문에서 학생의 요소 [1]가, 나 또한 여기 퍼팅 시도 ("2014-03-06-08 : 00", "2014-03-11-08 : 00")

두 개 이상의 항목 중 하나 이상의 항목이 모두 허용되지 않습니다. XML의 날짜 값

[1]은 XSLT가 첫 번째 요소를 가져 오는 것처럼 보이지만 빈 요소를 가져옵니다.

첫 번째 비어 있지 않은 요소를 어떻게 잡아낼 수 있습니까? [text() != '']이 도움이 될 것이라고 생각했지만 그렇지 않습니다.

+0

XML이 유효하지 않습니다. '' – Utkanos

+0

@Utkanos - 죄송합니다, 복사하여 붙여 넣기 오류 뒤에 ''. – RXC

+2

나에게 잘 들리네 - http://www.xmlplayground.com/lTakkR – Utkanos

답변

2

나는 이것이 당신이 필요로하는 것보다 훨씬 더 복잡하게 만들고 있다고 생각합니다. 다음으로 시작해보십시오 :

<xsl:variable name="firstDate" select="/ROOT/Student[last_printed/text()][1]/last_printed" /> 

비어 있지 않은 값이 처음이므로 (문서 순서대로!) 필요에 따라 다시 포맷 할 수 있습니다.

3

위의 요소와 일치하는 템플릿을 작성하는 것은 어떻습니까? 텍스트 노드가 다른 last_printed 요소에 의해 선행되지

<xsl:template match="last_printed[text() and not(preceding::last_printed/text())]"> 

이 텍스트 노드가있는 첫 번째 last_printed 요소를 발견, 즉,.


나는 당신이 얻을 오류를 재현 할 수

하지만,이 :

하나 개 이상의 항목의 순서는 문자열-이후의 첫 번째 인수 ("2014-03-06-으로 허용되지 않습니다

8시 ","2014-03-11-08 : 00 ")

가 명확하게는 (메시지 substring-after 약 문자열 함수의 첫 번째 인수로서 문자열 시퀀스 공급되는 것을 의미 귀하의 코드에만 012 언급).

따라서 잠재적으로 둘 이상의 일치 항목이있을 수있는 행을 찾으려면 코드를 면밀히 조사해야합니다.

그리고 또 하나. element[text() != '']을 사용하는 경우 의 모든 문자는이고 텍스트 노드가 있지만 일부는 비어 있거나 ''과 같다고 가정합니다.

하지만 사실이 아닙니다. 요소에 텍스트 내용이 없으면 텍스트 노드도 없습니다. 따라서

<xsl:if test="element[text() != '']"> 

과 같은 조건은 텍스트 노드가 존재하지 않아 빈 문자열이기 때문에 빈 요소에 대해 "false"를 반환합니다. 이에 따라,

<xsl:if test="element[text()]"> 

은 본질적으로 동일합니다.

관련 문제